在forkJoin中使用mergeMap来获得可观察的对象

问题描述

我有几个异步请求的组合,需要一起完成(使用forkJoin完成)-这样做时,我会初始化一个对象:

    export class fullData
    {
        AProp  : any;
        BProp  : any;
        CProp  : any;
    }
    const fullDataObservable : fullData = forkJoin(
    {
        AProp : this.myFirstSrv.getAProp(),BProp : this.mySecondsSrv.getBProp(),CProp : this.myThirdSrv.getCProp()
    });
    return fullDataObservable;      

到目前为止-很好。现在-我在此对象中有 3个新属性

    export class fullData
    {
        AProp  : any;
        BProp  : any;
        CProp  : any;
        prop1 : any;
        prop2 : any;
        prop3 : any;
        
    }

随后的第一 prop1 )取决于CProp值(或this.myThirdSrv.getCProp())作为参数,在执行获取请求时, second(prop2)第一个的简单操作,而第三个( prop3 )也取决于 second 作为获取请求中的参数。我试过使用mergeMap,但没有用。我在做什么错了?:

    gatherAllRelevantData() : any
      {
        //this.myService.getProp1() return observable after get request 
        this.myService.getProp1().pipe
        (
          mergeMap((prop1Value : any[]) => 
          {
            //this.myService.getResultAfterSimpleManipulation return object,not observable
            let prop2Values : any[] = this.myService.getResultAfterSimpleManipulation(prop1Value);
            //the this.getProp3Value return observable aftet get request
            return this.getProp3Value(prop2Value).pipe(
              map(prop3Values => 
                {
                  return { prop1 : prop1Value,prop2 : prop2Values,prop3 : prop3Values };
                })
            )
          }
      ));
    }

这一切都应该在resolve函数中完成,并且应该通过从this.gatherAllRelevantData中获取数据(不会发生)来启动fullData对象,并且无需执行this.gatherAllRelevantData:

    resolve(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<any> 
    {
      const fullDataObservable = forkJoin(
      {
        AProp : this.myFirstSrv.getAProp(),CProp : this.myThirdSrv.getCProp(),prop1 : this.gatherAllRelevantData().map(item => items.prop1),prop1 : this.gatherAllRelevantData().map(item => items.prop1)
    });
    return fullDataObservable; 
  } 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)