switchMap()如何解析Promise?

10 javascript promise observable rxjs angular

我正在阅读Angular 2教程,我是关于路由器的部分,特别是关于使用Observable从URL中提取参数的部分.它使用Observables.

部分代码是这样的:

ngOnInit(): void {
        this.route.params
            .switchMap((params: Params) => this.heroService.getHero(+params['id']))
            .subscribe(hero => this.hero = hero);
    }
Run Code Online (Sandbox Code Playgroud)

getHero()方法:

getHero(id: number): Promise<Hero> {
        return this.getHeroes()
            .then(heroes => heroes.find(hero => hero.id === id));
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,getHero()强类型是返回Hero类型的Promise.它返回一个then()调用的结果,据我所知,这是一个Promise.

所以switchMap()收到一个承诺.据我了解它的功能switchMap(),它需要它给出的任何东西,并从中产生一个新的Observable. subscribe()然后获取Observable持有的值并将其赋值给this.hero.

这是我没有得到的:hero实例变量是强类型的,用于保存Hero对象.既然switchMap()创建了一个Observable getHero()的返回值,并getHero()返回一个Promise,那么在我看来,subscribe()就是分配一个Promise<Hero>to this.hero.我不明白Promise是如何得到解决的,它的实际值被提取并放入hero实例var中.

感谢任何能够对此有所了解的人!

mar*_*tin 11

这是RxJS 5中没有很好记录的功能之一.所有期望从某些回调接收Observable的运算符实际上都与Observables,Promises,iterators,array,...

看看这些:

  1. http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html
  2. http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~SubscribableOrPromiseDoc.html

所以会发生什么是switchMap()订阅Promise返回的getHero(...)就像它是一个Observable.

源代码的核心部分在这里:

这一原则的一个非常常见的用法是将一系列物品拆包成单独的排放物.例如:

Observable.of([1,2,3,4])
  .concatAll()
  .subscribe(console.log);
Run Code Online (Sandbox Code Playgroud)

这将打印:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

查看现场演示:https://jsbin.com/sevale/4/edit?js,console

即使根据手册concatAll()正式工作,只有发射Observables的Observables才能正常工作.