Rxjs toPromise 行为不同于 observable

Posted

技术标签:

【中文标题】Rxjs toPromise 行为不同于 observable【英文标题】:Rxjs toPromise behavior different than observable 【发布时间】:2016-11-28 04:09:59 【问题描述】:

我有一个简单的例子,其中两个方法创建并返回一个承诺。第二个方法buildRedCar()调用第一个方法buildCar(),修改promise返回的值,从自身返回另一个promise。代码然后调用buildRedCar(),并且只是console.logs 输出结果。这在转换为 Promise 时不起作用,但在使用直接可观察对象时它确实起作用。

不起作用

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】:

当 RxJs 将 Observable 转换为 Promise 时,它​​会创建一个 Promise,该 Promise 将从 observable 中产生 last 值。因此,在底层 observable 完成之前,promise 不会解决。

在您的第一个示例(以及您的第二个示例)中,您从未完成可观察的红色汽车。因此,承诺永远不会解决。因此,包装承诺的 observable 永远不会产生价值......

您的第二个示例有效,因为订阅会急切地打印您的红色汽车可观察到的第一个值到达时,然后“等待”进一步的结果,而这些结果永远不会到达。

添加对onComplete 的调用应该可以使您的第一个版本工作:

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

【讨论】:

以上是关于Rxjs toPromise 行为不同于 observable的主要内容,如果未能解决你的问题,请参考以下文章

Angular/rxjs:为啥我不必再导入 toPromise 了? [关闭]

Angular 2:“Observable<Response>”类型上不存在属性“toPromise”

RxJS Observables 的 Promise.all 行为?

$.post() 的行为不同于 $.ajax(same parameters )

RxJs操作符,其行为类似于withLatestFrom,但会等待第二个流的值。

Angular RxJs行为主题未正确更新