【发布时间】:2017-11-30 18:22:54
【问题描述】:
我正在学习 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() 收到了一个 Promise 回复。据我了解switchMap() 的功能,它会获取所提供的任何内容并从中生成一个新的 Observable。 subscribe() 然后获取 Observable 持有的值并将其分配给 this.hero。
这是我不明白的:hero 实例变量被强类型化以保存 Hero 对象。由于switchMap() 从getHero() 的返回值中创建了一个Observable,而getHero() 返回了一个Promise,那么在我看来,subscribe() 正在将Promise<Hero> 分配给this.hero。我不明白 Promise 是如何得到解决的,它的实际值是如何被提取并放入 hero 实例变量中的。
感谢任何对此有任何见解的人!
【问题讨论】:
-
AFAICT(我不是 Angular 开发者)当 Promise 通过
subscription方法解析时,类型 hero 的值将异步设置为该实例的hero属性。但是,您必须使用 Observable 来可靠地访问它,如果异步操作尚未完成,简单地尝试进行成员访问可能会失败。 -
嗯,我没有真正理解的是
switchMap不应该创建一个新的 Observable 而是扁平化嵌套的 Observable。我不知道 switchMap 可以与Promise一起使用,而且它似乎没有记录在 reactivex.io/rxjs/class/es6/… -
您从哪个文件和提交哈希或链接获得
this.route.params.switchMap?我刚刚克隆了这个项目,但我找不到。它现在被重构并且不使用 switchMap。 -
Jared,所以你是说
subscribe()auto-resolves Promises? Juan,这是 Angular 2 教程的一部分,位于 www.angular.io
标签: javascript angular promise rxjs observable