【问题标题】:How to wait for function with subscribe to finish in angular 8?如何等待订阅功能在角度 8 中完成?
【发布时间】:2020-07-29 15:46:35
【问题描述】:

我想等待一个函数完成,然后再执行它旁边的函数。 我有一个名为 getData() 的函数,其中发生了 http 调用,它返回一个 observable。第二个函数 checkDuplicate() 我们订阅了该函数 getData() 。我们还有第三个函数称为 proceed(),我们在其中调用 checkDuplicate() 函数,一旦 checkDuplicate() 函数完成,我们正在调用 alert("finished")。但是这里的问题是,甚至在 checkDuplicate() 函数完成之前,警报已经被触发了。

查找代码以获得更好的说明:

getData(): Observable<any>{
  return this.http.get<any>(URL...);
}

checkDuplicate(){

return this.getData().subscribe(response => {
   if(response){
      console.log("Inside");
  }
});
}

proceed(){
 this.checkDuplicate();
 console.log("finished");
}

实际结果

完成

里面

预期结果

里面

完成

我已尝试 asyn/await 等待 checkDuplicate() 函数完成。但还是没有用。 如果您分享解决方案,将不胜感激。 提前致谢!!!

【问题讨论】:

    标签: async-await observable angular8 wait subscribe


    【解决方案1】:

    异步编程的陷阱。这是一个带有 Promise 的解决方案(你也可以使用 observables):

    getData(): Observable<any>{
      return this.http.get<any>(URL...);
    }
    
    async checkDuplicate(){
      var response = await this.getData().toPromise();
      if (response) {
          console.log("Inside");
      }
    }
    
    async proceed(){
     await this.checkDuplicate();
     console.log("finished");
    }
    

    【讨论】:

    • 感谢您的回答@Andrei Tătar!但仍然遇到同样的问题
    • @sherinshaf 您可能使用不同的代码。发布您的完整代码。
    • 相同的代码。一旦我打电话给await this.getData().toPromise();,控制就转到proceed()函数中的console.log("finished")..它不等待响应
    • 您是否从我的回复中复制了所有代码? proceed 也有 async/await
    • 我们在一个不是异步方法的拦截器中怎么办?