Angular 如何在循环中运行http put请求并获取每个请求的状态

Angular 如何在循环中运行http put请求并获取每个请求的状态,angular,rxjs,httprequest,angular-services,Angular,Rxjs,Httprequest,Angular Services,我有一个对象数组,它的每个对象都需要通过put http请求在数据库中更新 [ {id:“3e81731f-e3b4-405d-a5ca-bef52c1b036a”,创建日期:“2019-07-24T15:55:31.372460Z”,修改日期:“2020-07-13T03:25:02.720870Z”,einsight_UID:“d15176ab-ecf8-dba1-e040-10ac316407fa”,属性:{…}, {id:“4707bff2-8265-456f-a4d4-ca1134d8

我有一个对象数组,它的每个对象都需要通过put http请求在数据库中更新

[
{id:“3e81731f-e3b4-405d-a5ca-bef52c1b036a”,创建日期:“2019-07-24T15:55:31.372460Z”,修改日期:“2020-07-13T03:25:02.720870Z”,einsight_UID:“d15176ab-ecf8-dba1-e040-10ac316407fa”,属性:{…},
{id:“4707bff2-8265-456f-a4d4-ca1134d85620”,创建日期:“2019-07-24T15:55:31.372460Z”,修改日期:“2020-07-13T03:25:06.238019Z”,einsight_UID:“fcda4259-3ecb-4566-85b0-5b6d5c7647f6”,属性:{…}
{id:“d29a3340-04b6-431b-8671-a0f0d25a9b51”,创建日期:“2019-07-24T15:55:31.3724”,修改日期:“2020-07-13T03:25:06.238019Z”,einsight:“fcda4259-3ecb-4566-85b0-5b6d5c7647f6”,属性:{…}
]
如何调用api将每个记录保存在数组中。在循环中调用Api是一个简单的选择,但这还不够。我想记录下每一个回复。他们中有多少人成功或失败了。
在angular或rxjs中执行此类操作是否有任何已知的最佳实践?您可以使用rxjs concat,但如果observable抛出错误,concat将停止,因此您可以使用catchError返回新的observable

从'rxjs'导入{of,concat};
....
数据=[
{id:1},
{id:2},
{id:-1},
{id:2},
]
构造函数(专用http:HttpClient){
让httpReqs=this.data
.map(i=>
这是http.put(`https://jsonplaceholder.typicode.com/posts/${i.id}`,{})
.pipe(catchError(err=>of({err})))
);
concat(…httpReqs.subscribe(console.log)
}

demo您可以根据请求的数量和您的需求以并行或顺序请求的方式进行

并行请求 将RxJS函数与and运算符一起使用。试试下面的方法

从'rxjs'导入{forkJoin,of,from};
从'rxjs/operators'导入{tap,catchError,concatMap};
putDataParallel(){

让success=0;///如您所见,每个项目都将使用concateMap进行处理,并且在发出
HTTP
请求后,每个项目
结果
数组将被更新。 有多种方法,你可以实现这个结果。这是这里显示的方法之一

 items =[
       {id: "3e81731f-e3b4-405d-a5ca-bef52c1b036a", name :'united', result:[]},
       {id: "4707bff2-8265-456f-a4d4-ca1134d85620", name: 'ind', result:[]},
       {id: "d29a3340-04b6-431b-8671-a0f0d25a9b51", name:'ru', result:[]},
       {id: "xxx-xxxx-xxxx-xxxxx", name:'', result:[]}
    ]



from(this.items)
    .pipe(
        concatMap(item => this.ob2(item.name).pipe(
          catchError(err=>of(err)),
          tap(result =>{
            if(result.length){
              item.result = result;
            }else{
              // error scenario can be handled here
            }
            console.log('Updated each item', item)
          })
        ))
    ).subscribe();
  }

每次调用api时,您都会得到一个可观察的
响应,您可以
.subscribe()
。在这些
subscribe
回调中,您将获得每个请求的响应。这是否符合您的要求?是的,我可以这样做。我可以订阅响应并使用每个记录状态更新用户。因此,在循环中调用put请求完全可以吗?没有性能问题?我想知道是否存在性能问题是否有类似于ForkJoin的东西可供put使用?谢谢回答,但我不想在所有记录完成之前停止。concat将在出现错误时停止,但我使用catchError返回一个新的可观察对象。在这种情况下,下一个可观察对象将运行,请检查演示控制台