Kev*_*vin 4 promise observable rxjs angular
在官方的angular2教程中,它包含以下代码
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'])));
}
Run Code Online (Sandbox Code Playgroud)
现在我们知道this.route.params返回一个observable,同时
this.heroService.getHero(+params['id'])返回一个promise
这是签名 rxjs switchmap
switchMap(project: function: Observable, resultSelector: function(outerValue, innerValue, outerIndex, innerIndex): any): Observable
Run Code Online (Sandbox Code Playgroud)
我们看到第一个参数采用发出可观察的函数.
但是在上面的例子中,我们实际上传递了一个发出promise的函数.
它们是否相互兼容?
此外还有控制台
console.log(this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id'])));
Run Code Online (Sandbox Code Playgroud)
输出
AnonymousSubject {_isScalar: false, observers: Array[0], closed: false, isStopped: false, hasError: false…}
Run Code Online (Sandbox Code Playgroud)
不应该_isScalar设置为true,因为函数输出一个承诺?
在许多地方,RxJS API接受ObservableInput:
export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T>;
Run Code Online (Sandbox Code Playgroud)
这可以是一个可观察的,一个promise或一个类似数组的可迭代对象.
在您的问题中包含的代码中,project传递的函数switchMap返回一个promise.没关系,因为switchMap接受project返回的函数ObservableInput:
export function switchMap<T, R>(
this: Observable<T>,
project: (value: T, index: number) => ObservableInput<R>
): Observable<R>;
Run Code Online (Sandbox Code Playgroud)
该switchMap实施将看到的承诺转化为可观察到的.
关于结果observable的内部 _isScalar属性,它将被设置为truepromise解析并且已解析的值存储在observable中.我的理解是,在RxJS中,标量不是指将要发射的值的数量,而是指所述值是否可用于立即发射.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |