我有一个简单的例子,其中两个方法创建并返回一个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?
答案 0 :(得分:11)
当RxJs将Observable转换为Promise时,它会创建一个Promise,它将从observable中产生 last 值。因此,在基础observable完成之前,promise将无法解决。
在你的第一个例子中(以及你的第二个例子),你永远不会完成红色汽车的观察。因此承诺永远不会解决。因此,包含承诺的观察者永远不会产生价值......
你的第二个例子是有效的,因为订阅时会急切地打印你的红色汽车可观察到的第一个值,然后“等待”以获得从未到达的更多结果。
添加对onComplete
的调用应该会使您的第一个版本正常工作:
observer.onNext('Red ' + car);
observer.onComplete();