使用forkJoin调用多API后如何匹配结果与请求?是否需更换操作符?
解答
首先明确:forkJoin的结果顺序是固定的
forkJoin返回的结果数组严格对应你传入的Observable数组的顺序,第一个结果对应第一个添加到requests里的请求,第二个对应第二个,以此类推,完全不会随机乱序。
方案1:利用顺序直接匹配原数组
不需要更换操作符,直接通过索引对应原数组项:
forkJoin(requests).subscribe(results => { results.forEach((result, index) => { // 原arrayOfData的第index项就是当前结果对应的请求源 arrayOfData[index].sum = result.sum; }); });
方案2:在请求时保留原数据标识(更健壮)
如果担心后续代码改动导致请求数组顺序变化,或者想让每个结果自带身份信息,可以在calculateSum中把原数据的id和API返回结果合并:
calculateSum(d: Data): Observable<Data> { return this.callAPI(d).pipe( // 合并原数据的id和API返回的sum,保留唯一标识 map(apiResult => ({ ...d, sum: apiResult.sum })) ); } // 订阅时直接通过id匹配原数组项 forkJoin(requests).subscribe(results => { results.forEach(result => { const targetItem = arrayOfData.find(item => item.id === result.id); if (targetItem) { targetItem.sum = result.sum; } }); });
是否需要更换操作符?
不需要。forkJoin就是为并行执行多个Observable、等待全部完成后统一返回结果的场景设计的,完全适配你的需求。如果需要每个请求完成后立即处理结果(而非等待全部完成),可以考虑mergeMap或concatMap,但这属于不同的业务场景。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

