【问题标题】:How does switchMap() resolve a Promise?switchMap() 如何解析 Promise?
【发布时间】: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&lt;Hero&gt; 分配给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


【解决方案1】:

这是 RxJS 5 中没有很好记录的特性之一。所有希望从某个回调中接收 Observable 的操作符实际上都与 Observables、Promises、迭代器、数组......

看看这些:

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

所以发生的情况是switchMap() 订阅了从getHero(...) 返回的Promise,就像它是一个 Observable 一样。

源码的核心部分在这里:

此原则的一个非常常见的用法是将一组项目拆包成单独的排放物。例如:

Observable.of([1,2,3,4])
  .concatAll()
  .subscribe(console.log);

这将打印:

1
2
3
4

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

即使根据手册 concatAll() 官方仅适用于发出 Observables 的 Observables,它仍然有效。

【讨论】:

  • 所以subscribe() 这里实际上解决了Promise 就像then() 一样?抱歉,我对此很陌生 - 我正在自学 Web 编程,所以我才刚刚开始思考这些概念。
  • @steelstring94 这与subscribe() 方法完全无关。是switchMap 负责处理来自其回调(params: Params) =&gt; this.heroService.getHero(...) 的返回值。它返回 Promise 而不是 Observable 的事实不是问题,因为 switchMaps 内部设计用于处理此用例。
  • 好吧,我想我明白了,至少基本上是这样。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2020-06-10
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2020-04-30
  • 2017-05-22
  • 2020-06-27
相关资源
最近更新 更多