如何使用forkJoin将成功和不成功的请求保存在不同的数组中



我想使用forkJoin将在请求中使用的成功和不成功的id保存在单独的数组中。例如:

let ids = [1001, 1002, 1003, 1004, 1005];
let reqs = [];
let successReqs = [];
let failReqs = [];
ids.forEach(id => { 
reqs.push(this.componentService.getVal(id)) 
});
forkJoin(reqs).subscribe(
(results) => {
console.log('ALL RESULT :', results);
}, 
(err) => {
console.log(err);
});

我有一个";ids";数组,该数组包含要在请求中使用的id。使用这些id,我正在创建一个名为"的数组;reqs";要在forkJoin中使用。但有时服务可能会失败,所以为了以后使用,我想将成功请求的id保存在";successReqs";数组中的失败请求的id;failReqs";大堆但我找不到如何在成功或失败时将这些id添加到数组中。返回订阅中所有请求的结果。我该怎么办?

不确定它是否是最优的,但我只会捕捉每个请求的错误,因此我有一组从不失败的可观察对象。

const reqs: Observable<any>[];
const neverFailReqs = reqs.map(req => req.pipe(map(result => ({success: true, result})))
.pipe(catchError(result => ({success: false, result}))));
forkJoin(neverFailReqs).subscribe(results => {
console.log('Success: ' + results.filter(r => r.success).map(r => r.result));
console.log('Fail: ' + results.filter(r => !r.success).map(r => r.result));
})

您可以在每次调用中标记成功和失败,然后再将它们分开。使用此解决方案,您可以看到我将成功的值映射到success: true,并将错误映射到使用success: false发出错误的流。

稍后,一旦它们都运行完毕,我就可以根据我创建的成功标志来过滤结果,然后将结果映射回每个结果返回的纯有效负载。

我还会保留每个呼叫的id,无论成功与否。

const ids = [1001, 1002, 1003, 1004, 1005];
forkJoin(
ids.map(id => 
this.componentService.getVal(id).pipe(
map(val => ({
id,
success: true,
payload: val
})),
catchError(err => of({
id,
success: false,
payload: err
}))
)
)
).pipe(
map(res => ({
successReqs: res.filter(ob => ob.success).map(ob => ({
id: ob.id,
result: ob.payload
})),
failReqs: res.filter(ob => !ob.success).map(ob => ({
id: ob.id,
error: ob.payload
}))
}))
).subscribe(({successReqs, failReqs}) => {
console.log('Success RESULT :', successReqs);
console.log('Fail RESULT :', failReqs);
}
);

最新更新