将 concatMap 结果传递给 rxjs 中的下一个 concatMap

Cod*_*-EZ 1 rxjs angular

你可以看到我有一个方法,它按照我的预期工作得很好

loadTemplates(configUrl: any, templateId: string): Observable<any> {
    this.getConfiguration(configUrl)
      .pipe(

        concatMap(configResponse =>
          this.getTemplate(
            CONFIGURATION_URL +
              "templates/" +
              configResponse.TemplateSettings.RootTemplate.Path,
            configResponse
          )
        ),
        concatMap(rootTemplate =>
          this.templateEngine.getAllChildTemplates(rootTemplate)       
        ),
        concatMap(childTemplates=>this.templateEngine.createTemplateToRender(childTemplates,""))
      )
      .subscribe(finalresponse=> {

        debugger;
      });

  }
}
Run Code Online (Sandbox Code Playgroud)

执行

  1. getTheConfiguration() => 基于配置响应 =>
  2. 调用 getTemplate(basedontheconfigresponse)=>basedontheTemplateresponse=>
  3. 调用 getAllChildTemplates(basedontheTemplateresponse )=> basedonthechildtemplateresponse=>
  4. 调用 createTemplate(basedonthechildtemplateresponse,"")

在第 4 个要点中,我将一个空参数传递给createTemplate方法,实际上我必须传递basedntheTemplateresponse(在代码rootTemplate中)。现在我正在通过设置执行getAllChildTemplates时进行调整

getAllChildTemplates(parentTemplate: string) {
    this.currentrootTemplate = parentTemplate;
    var services = this.getChildTemplateServiceInstance(parentTemplate);
    return forkJoin(services);
  }
Run Code Online (Sandbox Code Playgroud)

有没有正确的方法将rootTemplate从管道本身传递到下一个concatMap?我不确定这是正确的方法。

mar*_*tin 5

您可以将内部 Observable 的结果映射到当前响应和前一个响应的数组中:

concatMap(rootTemplate =>
  this.templateEngine.getAllChildTemplates(rootTemplate).pipe(
    map(childTemplates => [rootTemplate, childTemplates])
  )
),
concatMap(([rootTemplate, childTemplates]) => 
  this.templateEngine.createTemplateToRender(childTemplates, rootTemplate)
)
Run Code Online (Sandbox Code Playgroud)