【问题标题】:Wait for inner subscriptions inside map?等待地图内的内部订阅?
【发布时间】:2018-03-09 12:55:09
【问题描述】:

当我尝试在 map 函数内部订阅时,可观察对象不会等待内部订阅执行。

我有后续:

        return this.http.get(url).map((project)=>{       
             // replace pilot id by pilot object 
             this.UserService.retrieveObject(project.pilot).subscribe(pilot => { 
                 project.pilot = pilot,
             })

             //replace owner id by owner object
             this.UserService.retrieveObject(project.owner).subscribe(owner => { 
                 project.owner = owner,
             })
             return project;
         });

返回的 project 对象包含所有者和飞行员 ID,而不是对象,因为它不等待订阅。

如何让 observable 等待所有内部订阅完成?

【问题讨论】:

标签: angular rxjs reactive-programming


【解决方案1】:

您需要对此进行重大重构。

您可以使用forkJoin 等待两个 Observable 完成,然后使用其“投影”功能更新project 对象:

return this.http.get(url)
    .mergeMap(project => Observable.forkJoin(
        this.UserService.retrieveObject(project.pilot),
        this.UserService.retrieveObject(project.owner),
        (pilot, owner) => {
            project.pilot = pilot;
            project.owner = owner
            return project;
        }
    ));

【讨论】:

  • 有一点值得指出的是错误行为:如果任何一个子请求失败,整个链都会失败。
  • 我爱你,如果没有你的回答,我永远猜不到最后一个 forkJoin 参数的作用。 TY 虚拟机
  • @IngoBürk 如何使即使一个请求失败也能执行?
  • 您可以在forkJoin 内的请求中添加.catch(…) 来处理各个子请求中的错误。
猜你喜欢
  • 2020-02-01
  • 2018-11-16
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2018-03-30
  • 2021-06-08
相关资源
最近更新 更多