Angular4 如何使用 flatMap 链接 forkJoin

Angular4 how to chain forkJoin with flatMap

我现在的情况是我需要进行 5 个可以并行执行的 http 调用 + 另一个需要在这五个之后执行的 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];

编译器抱怨类型转换,所以我会在这里为其他人报告我的解决方案。

为了摆脱这个问题,您可以利用 "destructuring"(更多信息在这里:https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

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`
    ....
  });