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 )