Rxjs toPromise行为不同于可观察的行为

时间:2016-07-24 21:55:24

标签: javascript typescript promise rxjs observable

我有一个简单的例子,其中两个方法创建并返回一个promise。第二种方法buildRedCar()调用第一个方法buildCar(),修改promise返回的值并从自身返回另一个promise。然后代码调用buildRedCar(),只调用console.logs结果。这在转换为promises时不起作用,但在使用直观observable时 工作。

是否有效:

import * as Rx from 'rx';

function buildCar(): Rx.IPromise<string> {
    let car = 'Car';
    return Rx.Observable.just<string>(car).toPromise();
}

function buildRedCar(): Rx.IPromise<string> {
    let observable = Rx.Observable.create<string>((observer) => {
        buildCar().then((car) => {
            observer.onNext('Red ' + car);
        });
    })

    return observable.toPromise();
}

buildRedCar().then((car) => {
    console.log(car);
});

是否有效:

import * as Rx from 'rx';

function buildCar(): Rx.Observable<string> {
    let car = 'Car';
    return Rx.Observable.just<string>(car);
}

function buildRedCar(): Rx.Observable<string> {
    let observable = Rx.Observable.create<string>((observer) => {
        buildCar().subscribe((car) => {
            observer.onNext('Red ' + car);
        });
    })

    return observable;
}

buildRedCar().subscribe((car) => {
    console.log(car);
});

任何想法为什么不同的行为,唯一的区别是在返回之前将observable转换为promise?

1 个答案:

答案 0 :(得分:11)

当RxJs将Observable转换为Promise时,它会创建一个Promise,它将从observable中产生 last 值。因此,在基础observable完成之前,promise将无法解决。

在你的第一个例子中(以及你的第二个例子),你永远不会完成红色汽车的观察。因此承诺永远不会解决。因此,包含承诺的观察者永远不会产生价值......

你的第二个例子是有效的,因为订阅时会急切地打印你的红色汽车可观察到的第一个值,然后“等待”以获得从未到达的更多结果。

添加对onComplete的调用应该会使您的第一个版本正常工作:

observer.onNext('Red ' + car);
observer.onComplete();