在官方angular2 tutorial它包含以下代码
getHeroes(): Promise<Hero[]> {
return Promise.resolve(HEROES);
}
ngOnInit(): void {
this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id']))
.subscribe(hero => this.hero = hero);
console.log(this.route.params);
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
}
现在我们知道 this.route.params
返回一个 observable,而
this.heroService.getHero(+params['id'])
返回一个 promise
这是 rxjs
switchmap
switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable
我们看到第一个参数接受一个发出可观察对象的函数。
但是在上面的示例中,我们实际上传入了一个发出 promise 的函数。
它们是否相互兼容?
还有控制台
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
输出
AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…}
_isScalar
是否应该设置为 true,因为该函数输出一个 promise?
最佳答案
在很多地方,RxJS API 接受 ObservableInput
:
export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;
它可以是可观察对象、promise 或类似数组的可迭代对象。
在问题中包含的代码中,project
函数传递给了 switchMap
返回一个 promise 。这很好,因为 switchMap
接受返回 ObservableInput
的 project
函数:
export function switchMap<T, R>(
this: Observable<T>,
project: (value: T, index: number) => ObservableInput<R>
): Observable<R>;
switchMap
实现将看到 promise 被转换为 observable。
关于结果可观察对象的 internal _isScalar
属性,当 promise 解析并且解析的值存储在可观察的。我的理解是,在 RxJS 中,标量 不是指将发出的值的数量,而是指所述值是否可用于立即发出。
关于angular - observable 和 promise 在 rxjs 中兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916444/