From f121d2eecc67e1fb19da03e50bc970d775fdd863 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Mon, 6 Jan 2014 22:49:12 +0400 Subject: [PATCH] rx.async: added tests; added toPromise operator --- rx.js/rx.async-tests.ts | 80 +++++++++++++++++++++++++++++++++++++++++ rx.js/rx.async.d.ts | 26 +++++++++++--- 2 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 rx.js/rx.async-tests.ts diff --git a/rx.js/rx.async-tests.ts b/rx.js/rx.async-tests.ts new file mode 100644 index 0000000000..636aa30de9 --- /dev/null +++ b/rx.js/rx.async-tests.ts @@ -0,0 +1,80 @@ +// Tests for RxJS-Async TypeScript definitions +// Tests by Igor Oleinikov + +/// + +module Rx.Tests.Async { + + var obsNum: Rx.Observable; + var obsStr: Rx.Observable; + var sch: Rx.IScheduler; + + function start() { + obsNum = Rx.Observable.start(()=> 10, sch, obsStr); + obsNum = Rx.Observable.start(()=> 10, sch); + obsNum = Rx.Observable.start(()=> 10); + } + + function toAsync() { + obsNum = Rx.Observable.toAsync(()=> 1, sch)(); + obsNum = Rx.Observable.toAsync((a1: number)=> a1)(1); + obsStr = Rx.Observable.toAsync((a1: string, a2: number)=> a1 + a2.toFixed(0))("", 1); + obsStr = Rx.Observable.toAsync((a1: string, a2: number, a3: Date)=> a1 + a2.toFixed(0) + a3.toDateString())("", 1, new Date()); + obsStr = Rx.Observable.toAsync((a1: string, a2: number, a3: Date, a4: boolean)=> a1 + a2.toFixed(0) + a3.toDateString() + (a4 ? 1 : 0))("", 1, new Date(), false); + } + + function fromCallback() { + // 0 arguments + var func0: (cb: (result: number)=> void)=> void; + obsNum = Rx.Observable.fromCallback(func0)(); + obsNum = Rx.Observable.fromCallback(func0, sch)(); + obsNum = Rx.Observable.fromCallback(func0, sch, obsStr)(); + obsNum = Rx.Observable.fromCallback(func0, sch, obsStr, (results: number[]) => results[0])(); + + // 1 argument + var func1: (a: string, cb: (result: number)=> void)=> number; + obsNum = Rx.Observable.fromCallback(func1)(""); + obsNum = Rx.Observable.fromCallback(func1, sch)(""); + obsNum = Rx.Observable.fromCallback(func1, sch, {})(""); + obsNum = Rx.Observable.fromCallback(func1, sch, {}, (results: number[]) => results[0])(""); + + // 2 arguments + var func2: (a: number, b: string, cb: (result: string) => number) => Date; + obsStr = Rx.Observable.fromCallback(func2)(1, ""); + obsStr = Rx.Observable.fromCallback(func2, sch)(1, ""); + obsStr = Rx.Observable.fromCallback(func2, sch, {})(1, ""); + obsStr = Rx.Observable.fromCallback(func2, sch, {}, (results: string[]) => results[0])(1, ""); + + // 3 arguments + var func3: (a: number, b: string, c: boolean, cb: (result: string) => number) => Date; + obsStr = Rx.Observable.fromCallback(func3)(1, "", true); + obsStr = Rx.Observable.fromCallback(func3, sch)(1, "", true); + obsStr = Rx.Observable.fromCallback(func3, sch, {})(1, "", true); + obsStr = Rx.Observable.fromCallback(func3, sch, {}, (results: string[]) => results[0])(1, "", true); + + // multiple results + var func0m: (cb: (result1: number, result2: number, result3: number) => void) => void; + obsNum = Rx.Observable.fromCallback(func0m, sch, obsStr, (results: number[]) => results[0])(); + var func1m: (a: string, cb: (result1: number, result2: number, result3: number) => void) => void; + obsNum = Rx.Observable.fromCallback(func1m, sch, obsStr, (results: number[]) => results[0])(""); + var func2m: (a: string, b: number, cb: (result1: string, result2: string, result3: string) => void) => void; + obsStr = Rx.Observable.fromCallback(func2m, sch, obsStr, (results: string[]) => results[0])("", 10); + } + + function toPromise() { + var promiseImpl: { + new(resolver: (resolvePromise: (value: T)=> void, rejectPromise: (reason: any)=> void)=> void): Rx.IPromise; + }; + + var p: IPromise = obsNum.toPromise(promiseImpl); + + p = p.then(x=> x); + p = p.then(x=> p); + p = p.then(undefined, reason=> 10); + p = p.then(undefined, reason=> p); + + var ps: IPromise = p.then(undefined, reason=> "error"); + ps = p.then(x=> ""); + ps = p.then(x=> ps); + } +} \ No newline at end of file diff --git a/rx.js/rx.async.d.ts b/rx.js/rx.async.d.ts index 2e511444a7..cdd93b9a86 100644 --- a/rx.js/rx.async.d.ts +++ b/rx.js/rx.async.d.ts @@ -1,6 +1,6 @@ /// -// Type definitions for RxJS-Async package 2.2 +// Type definitions for RxJS-Async package 2.2.11 // Project: http://rx.codeplex.com/ // Definitions by: zoetrope // Revision by: Igor Oleinikov @@ -84,11 +84,29 @@ declare module Rx { fromEvent(element: Node, eventName: string, selector?: (arguments: any[]) => T): Observable; fromEventPattern(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[])=>T): Observable; - fromPromise(promise: Promise): Observable; + fromPromise(promise: IPromise): Observable; fromPromise(promise: any): Observable; } - interface Promise { - then(onFulfill: (value: T) => any, onReject?: (reason: any) => any): any; + interface Observable { + /** + * Converts an existing observable sequence to an ES6 Compatible Promise + * @example + * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise); + * @param The constructor of the promise + * @returns An ES6 compatible promise with the last value from the observable sequence. + */ + toPromise>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise; + toPromise(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise; }): IPromise; + } + + /** + * Promise A+ + */ + export interface IPromise { + then(onFulfilled?: (value: T) => IPromise, onRejected?: (reason: any) => IPromise): IPromise; + then(onFulfilled?: (value: T) => IPromise, onRejected?: (reason: any) => R): IPromise; + then(onFulfilled?: (value: T) => R, onRejected?: (reason: any) => IPromise): IPromise; + then(onFulfilled?: (value: T) => R, onRejected?: (reason: any) => R): IPromise; } }