Angular4如何使用flatMap链接forkJoin

Angular4如何使用flatMap链接forkJoin,angular,http,rxjs,chaining,Angular,Http,Rxjs,Chaining,我需要进行5个可以并行执行的http调用+在这5个调用之后需要执行的另一个http调用 我在前5个版本中使用了forkJoin,但我不知道如何链接flatMap或其他函数 forkJoin( firstObservable, secondObservable, thirdObservable, ..) .subscribe(results => { this.myComposedObject = results[

我需要进行5个可以并行执行的http调用+在这5个调用之后需要执行的另一个http调用

我在前5个版本中使用了forkJoin,但我不知道如何链接flatMap或其他函数

forkJoin(
      firstObservable,
      secondObservable,
      thirdObservable,
      ..)
      .subscribe(results => {

        this.myComposedObject = results[0];
        let secondResult = results[1];
        let thirdResult = results[2];
        [...]


        // !!! AT THIS POINT I WOULD NEED TO MAKE AN EXTRA CALL!
        // results[1] contains data I need to make the extra call


        // 
        this.myComposedObject.second = secondResult;
        this.myComposedObject.third = thirdResult;
});

我在一个组件中执行此操作,因此最后我将数据分配给myComposedObject。

就像您所说的,可以使用forkJoin发出5个并行请求。然后,您希望在前5个操作完成后发出另一个请求,这样您就可以使用concatMap操作符链接它,或者mergeMap也可以在这里工作

然后,您需要将所有结果组合在一起,以便可以使用map将最后一个结果添加到与前五个结果相同的数组中

forkJoin(
    firstObservable,
    secondObservable,
    thirdObservable,
    ...
  )
  .concatMap(firstFiveResults => makeAnotherCall(firstFiveResults[1])
    .map(anotherResult => [...firstFiveResults, anotherResult])
  )
  .subscribe(allResults => {
    this.myComposedObject.second = allResults[1];
    this.myComposedObject.third = allResults[2];
    // allResults[5] - response from `makeAnotherCall`
    ....
  });

谢谢,这为我指明了正确的方向。 我对结果类型有一些问题。当我试图分配

this.myComposedObject.second = allResults[1];
编译器抱怨类型转换,所以我将在这里向其他人报告我的解决方案

为了解决此问题,您可以在此处利用分解更多信息:

forkJoin(
    firstObservable,
    secondObservable,
    thirdObservable,
    ...
  )
  .concatMap(firstFiveResults => makeAnotherCall(firstFiveResults[1])
    .map(anotherResult => [...firstFiveResults, anotherResult])
  )
  .subscribe((allResults: [
     TypeA, <-- type returned from firstObservable
     TypeB, 
     TypeC, 
     TypeD, 
     TypeE
   ]) => {
    this.myComposedObject.second = allResults[1];
    this.myComposedObject.third = allResults[2];
    // allResults[5] - response from `makeAnotherCall`
    ....
  });