Angular如何使订阅等待呼叫完成

时间:2018-04-23 13:31:49

标签: angular get rxjs httpclient

INSERT注意:这个问题与大多数其他问题不同,例如"如何从异步调用中返回响应?"因为它使用SUBSCRIBE。据我所知,subscribe告诉它在更改这个东西时做某事,因此你不能把代码放在subscribe中,因为它只会在它被改变时运行(这总是太晚了)。如果您了解Angular,Subscribe和HttpClient,请回答。现在我原来的问题是:

我遇到一个问题,我在数组中循环并对数组中的每个项执行get调用。我的问题是所有这些获取请求都是异步发生的,这意味着它们都会尝试获取而前一个获取请求仍在接收它们的响应。这会导致错误。这是一个粗略的例子:

 this.MyArray = [1, 2, 3, 4, 5];   

 this.MyArray.forEach(element => {
      this.httpClient.get('http...')
      .subscribe(
        (response: any) => {
      })
 )}

在继续循环中的下一个项目之前,如何让forEach循环等待调用响应?我试着查看回复,但我无法理解:(

2 个答案:

答案 0 :(得分:1)

您可以将数组映射到可观察的流中。然后,您可以使用concat运算符连续执行observable。

import {
  concat
} from 'rxjs/observable/concat';


this.MyArray = [1, 2, 3, 4, 5];

const observables: Observable<any>[] = this.myArray.map(() => this.httpClient.get('http...'));

concat(...observables).subscribe(resp => {
  // handle responses, they will execute one after another,
  //  each waiting for the previous one to finish
})

答案 1 :(得分:1)

试试这个

this.totalCount = this.MyArray.length;
this.i=1;

getData(){

 let ob = this.MyArray[this.i-1];

 this.httpClient.get('http...')
      .subscribe(
        (response: any) => {
            this.i++;
             if(this.i <= this.totalCount){
               getData()
             }
      })
}