微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用forkJoin将成功和失败的请求保存在单独的数组中?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。