我的情况是,我需要进行 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;
});
我在组件内执行此操作,因此最后我将数据分配给 myComlatedObject。
最佳答案
就像你说的,要发出 5 个并行请求,你可以使用 forkJoin
。然后,您想在前 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`
....
});
关于Angular4如何使用flatMap链接forkJoin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49305027/