我正在学习Angular 2教程,我的部分是关于路由器的,特别是关于使用Observable从URL提取参数的部分。它为此使用了Observables。
代码的一部分是这样的:
ngOnInit(): void {
this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id']))
.subscribe(hero => this.hero = hero);
}
和getHero()
方法:
getHero(id: number): Promise<Hero> {
return this.getHeroes()
.then(heroes => heroes.find(hero => hero.id === id));
}
如您所见,getHero()
强类型输入返回Hero类型的Promise。它返回then()
调用的结果,据我了解,这是一个Promise。
因此switchMap()
收到了承诺。据我了解的功能switchMap()
,它会使用给出的所有内容,并从中创建一个新的Observable。subscribe()
然后采用Observable保留的值并将其分配给this.hero
。
这是我没有得到的:hero
实例变量的类型很强,可以容纳一个Hero
对象。由于switchMap()
创建一个可观察出getHero()
的返回值,并getHero()
返回一个承诺,在我看来,那么,subscribe()
被分配Promise<Hero>
到this.hero
。我不了解该Promise如何得到解决,其实际值如何被提取并放入hero
实例var中。
感谢任何对此有任何见识的人!
那是RxJS 5的一个不太完善的功能之一。所有期望从某些回调工作中接收到一个Observable的运算符实际上都是与Observables,Promises,迭代器,数组等一起使用的。
看看这些:
因此,发生的事情就是switchMap()
订阅Promise
返回的内容,getHero(...)
就像它是一个Observable一样。
源代码的核心部分在这里:
在switchMap
- https://github.com/ReactiveX/rxjs/blob/master/src/operator/switchMap.ts#L108
在subscribeToResult
- https://github.com/ReactiveX/rxjs/blob/master/src/util/subscribeToResult.ts#L42
此原理的一个非常普遍的用法是将一系列物品拆开成单独的排放物时。例如:
Observable.of([1,2,3,4])
.concatAll()
.subscribe(console.log);
这将打印:
1
2
3
4
观看现场演示:https : //jsbin.com/sevale/4/edit?js,console
即使根据concatAll()
官方手册,只有在发射可观察物的可观察物下它才起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句