首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在循环中进行HTTP调用,然后等待一个调用完成后再进行另一个调用?

问如何在循环中进行HTTP调用,然后等待一个调用完成后再进行另一个调用?
EN

Stack Overflow用户
提问于 2018-12-25 13:55:42
回答 1查看 4.2K关注 0票数 7

我有一个项目数组,在每个元素上,我要进行一个HTTP调用,等待它完成,然后进行另一个调用,每次只调用一个。

我试过:

代码语言:javascript
复制
index(item) {
   return this.service.index(item).pipe(
      map(response => {
         // handle success case
      }),
      catchError(error => {
         // handle error case
      })
   )
}

async processArray(array) {
  const promises = array.map(item => this.index(item));
  await Promise.all(promises);
}

proccessArray(array);

还有NGRX效应:

代码语言:javascript
复制
@Effect()
effect$ = this.actions$.pipe(
   ofType<action>(actionTypes.action),
   mergeMapTo(this.store.select(getMyArray)),
   flatMap((request: any[]) => {
       return zip(...request.map(item => {  
         return this.service.index(item).pipe(
               map(response => {
                  // handle success case
               }),
               catchError(error => {
                  // handle error case
               })
            )
         }))
      }),
   );

还尝试在for和forEach循环中执行该操作,但它们同时触发了所有请求。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-25 15:32:18

如果您使用的是承诺,并且希望在进行另一个调用之前等待每个承诺解决,那么(1)您不应该使用Promise.all,因为这将等待所有请求被解析;(2)您需要使用一个普通的旧for -循环,它使您能够等待循环中的异步操作。

代码语言:javascript
复制
async processArray(array) {
  for(var i = 0; i < array.length; i++){
    await yourServiceCall();
  }
}

作为一个侧面:由于您使用异步等待,不要忘记转换您的观察到承诺。

如果您想摆脱承诺(和异步等待),转而依赖纯RxJS,请查看concatMap。

将每个源值投影到可观察到的输出中,并以序列化的方式将其合并到可观察的输出中,等待每个源值在合并下一个源值之前完成。

例如:

代码语言:javascript
复制
import { from } from 'rxjs/observable/from';

ngOnInit() {
  from(myArray)
    .pipe(concatMap(el => yourServiceCall(el)))
    .subscribe(/* your logic */);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53923003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档