Skip to content

Commit

Permalink
feat(TypeScript): fromPromise accepts PromiseLike object (#2505)
Browse files Browse the repository at this point in the history
* fix(PromiseObservable): can not create observable from promise conform to Promises/A+ spec

* docs(PromiseObservable): update the doc to reflect more relaxed type of promise

* test(fromPromise): ensure Observables can be created from other promise implementations
  • Loading branch information
Sarun Rattanasiri authored and benlesh committed May 9, 2017
1 parent bb0738f commit ade1fd5
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
19 changes: 19 additions & 0 deletions spec/observables/from-promise-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,25 @@ describe('Observable.fromPromise', () => {
});
});

it('should accept PromiseLike object for interoperability', (done: MochaDone) => {
class CustomPromise<T> implements PromiseLike<T> {
constructor(private promise: PromiseLike<T>) {
}
then(onFulfilled?, onRejected?): PromiseLike<T> {
return new CustomPromise(this.promise.then(onFulfilled, onRejected));
};
}
const promise = new CustomPromise(Promise.resolve(42));
Observable.fromPromise(promise)
.subscribe(
(x: number) => { expect(x).to.equal(42); },
() => {
done(new Error('should not be called'));
}, () => {
done();
});
});

it('should emit a value from a resolved promise on a separate scheduler', (done: MochaDone) => {
const promise = Promise.resolve(42);
Observable.fromPromise(promise, Rx.Scheduler.asap)
Expand Down
6 changes: 3 additions & 3 deletions src/observable/PromiseObservable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,19 @@ export class PromiseObservable<T> extends Observable<T> {
* @see {@link bindCallback}
* @see {@link from}
*
* @param {Promise<T>} promise The promise to be converted.
* @param {PromiseLike<T>} promise The promise to be converted.
* @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling
* the delivery of the resolved value (or the rejection).
* @return {Observable<T>} An Observable which wraps the Promise.
* @static true
* @name fromPromise
* @owner Observable
*/
static create<T>(promise: Promise<T>, scheduler?: IScheduler): Observable<T> {
static create<T>(promise: PromiseLike<T>, scheduler?: IScheduler): Observable<T> {
return new PromiseObservable(promise, scheduler);
}

constructor(private promise: Promise<T>, private scheduler?: IScheduler) {
constructor(private promise: PromiseLike<T>, private scheduler?: IScheduler) {
super();
}

Expand Down

0 comments on commit ade1fd5

Please sign in to comment.