如何使用 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);
  }
);