如何使用 forkJoin 将成功和不成功的请求保存在单独的数组中?
How can I keep successful and unsuccessful requests in separate arrays using 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 添加到数组中。 Returns 订阅中所有请求的结果。我该怎么办?
不确定它是否是最优的,但我会为每个请求捕获错误,因此我有一个永远不会失败的可观察对象数组。
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);
}
);
我想使用 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 添加到数组中。 Returns 订阅中所有请求的结果。我该怎么办?
不确定它是否是最优的,但我会为每个请求捕获错误,因此我有一个永远不会失败的可观察对象数组。
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);
}
);