Skip to content

Commit ade1fd5

Browse files
Sarun Rattanasiribenlesh
authored andcommitted
feat(TypeScript): fromPromise accepts PromiseLike object (#2505)
* 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
1 parent bb0738f commit ade1fd5

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

spec/observables/from-promise-spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,25 @@ describe('Observable.fromPromise', () => {
7272
});
7373
});
7474

75+
it('should accept PromiseLike object for interoperability', (done: MochaDone) => {
76+
class CustomPromise<T> implements PromiseLike<T> {
77+
constructor(private promise: PromiseLike<T>) {
78+
}
79+
then(onFulfilled?, onRejected?): PromiseLike<T> {
80+
return new CustomPromise(this.promise.then(onFulfilled, onRejected));
81+
};
82+
}
83+
const promise = new CustomPromise(Promise.resolve(42));
84+
Observable.fromPromise(promise)
85+
.subscribe(
86+
(x: number) => { expect(x).to.equal(42); },
87+
() => {
88+
done(new Error('should not be called'));
89+
}, () => {
90+
done();
91+
});
92+
});
93+
7594
it('should emit a value from a resolved promise on a separate scheduler', (done: MochaDone) => {
7695
const promise = Promise.resolve(42);
7796
Observable.fromPromise(promise, Rx.Scheduler.asap)

src/observable/PromiseObservable.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,19 @@ export class PromiseObservable<T> extends Observable<T> {
3131
* @see {@link bindCallback}
3232
* @see {@link from}
3333
*
34-
* @param {Promise<T>} promise The promise to be converted.
34+
* @param {PromiseLike<T>} promise The promise to be converted.
3535
* @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling
3636
* the delivery of the resolved value (or the rejection).
3737
* @return {Observable<T>} An Observable which wraps the Promise.
3838
* @static true
3939
* @name fromPromise
4040
* @owner Observable
4141
*/
42-
static create<T>(promise: Promise<T>, scheduler?: IScheduler): Observable<T> {
42+
static create<T>(promise: PromiseLike<T>, scheduler?: IScheduler): Observable<T> {
4343
return new PromiseObservable(promise, scheduler);
4444
}
4545

46-
constructor(private promise: Promise<T>, private scheduler?: IScheduler) {
46+
constructor(private promise: PromiseLike<T>, private scheduler?: IScheduler) {
4747
super();
4848
}
4949

0 commit comments

Comments
 (0)