Skip to content

Commit 361a53b

Browse files
committed
feat(operator): add toPromise operator. closes #159
1 parent 65eb50e commit 361a53b

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

spec/operators/toPromise-spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* globals describe, it, expect */
2+
var Rx = require('../../dist/cjs/Rx');
3+
var promise = require('promise');
4+
var Observable = Rx.Observable;
5+
6+
describe('Observable.prototype.toPromise()', function () {
7+
it('should convert an Observable to a promise of its last value', function (done) {
8+
Observable.of(1, 2, 3).toPromise(promise).then(function (x) {
9+
expect(x).toBe(3);
10+
done();
11+
});
12+
});
13+
14+
it('should handle errors properly', function (done) {
15+
Observable.throw('bad').toPromise(promise).then(function () {
16+
throw 'should not be called';
17+
}, function (err) {
18+
expect(err).toBe('bad');
19+
done();
20+
});
21+
});
22+
});

src/Observable.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ export default class Observable<T> {
129129
take: (count: number) => Observable<T>;
130130
takeUntil: (observable: Observable<any>) => Observable<T>;
131131
partition: (predicate: (x: T) => boolean) => Observable<T>[];
132-
132+
toPromise: (PromiseCtor: PromiseConstructor) => Promise<T>;
133+
133134
observeOn: (scheduler: Scheduler, delay?: number) => Observable<T>;
134135
subscribeOn: (scheduler: Scheduler, delay?: number) => Observable<T>;
135136

src/Rx.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,10 @@ observableProto.observeOn = observeOn;
122122
observableProto.subscribeOn = subscribeOn;
123123

124124
import partition from './operators/partition';
125+
import toPromise from './operators/toPromise';
125126

126127
observableProto.partition = partition;
128+
observableProto.toPromise = toPromise;
127129

128130
import _catch from './operators/catch';
129131
import retryWhen from './operators/retryWhen';

src/operators/toPromise.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Subscriber from '../Subscriber';
2+
3+
export default function toPromise<T>(PromiseCtor: PromiseConstructor = Promise): Promise<T> {
4+
return new PromiseCtor((resolve, reject) => {
5+
let value: any;
6+
this.subscribe(x => value = x, err => reject(err), () => resolve(value));
7+
});
8+
}

0 commit comments

Comments
 (0)