【问题标题】:Angular How to make subscribe wait for a call to finishAngular如何让订阅等待通话完成
【发布时间】:2018-04-23 13:31:48
【问题描述】:

插入注意:这个问题与大多数其他与诸如“如何从异步调用返回响应?”之类的问题不同的问题。因为它使用 SUBSCRIBE。据我了解,订阅会告诉它在更改此内容时执行某些操作,因此您不能将代码放入订阅中,因为它只会在更改时运行(这总是为时已晚)。请仅在您了解 Angular、Subscribe 和 HttpClient 的情况下回答。现在我原来的问题:

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

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

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

如何让 forEach 循环等待调用响应,然后再转到循环中的下一项?我试着看回复,但我就是不明白:(

【问题讨论】:

  • 执行时遇到什么错误?
  • 这是一个 promise 可观察的问题。除非您知道您的 observable 将返回什么,否则我看不到解决方案。

标签: angular get rxjs httpclient


【解决方案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()
             }
      })
}

【讨论】:

    【解决方案2】:

    您可以将数组映射到可观察的流中。然后你可以使用concat操作符来连续执行observables。

    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
    })
    

    【讨论】:

    • 我认为这对 Tomasz 不起作用。这里发生的情况是所有的 get 调用一个接一个地完成,然后它们的订阅值一个接一个地被填充。因此,您的订单是 4 个接听电话,然后是 4 个订阅响应。不是 1 次获得,1 次响应,1 次获得,1 次响应......这是我正在寻找的顺序
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多