异步调用HttpClient get

时间:2019-10-19 20:24:13

标签: angular httpclient

以下代码用于异步获取文件。 此方法属于服务。 从AppComponent类的构造函数中调用它。

public async ReadConfiguration () 
  {
      await this.http.get ('http://localhost:80/api/Target.xml',{ responseType: 'text' }).subscribe(
      (val) => {
          console.log("GET call successful value returned in body", val);
                      
      },
      response => {
          console.log("GET call in error", response);
      },
      () => {
          console.log("The GET observable is now completed.");
      }); 

    /*await this.http.get('http://localhost:80/api/Target.xml',{ responseType: 'text' }).toPromise()
    .then((data: any) => {
     
      console.time('request-length');
      console.log(data);
      console.timeEnd('request-length');

    });*/
  }

在调用“ ReadConfiguration”之后,我立即致电:

console.log ('Completed');

但是根据控制台,HttpClient.get是在“ Completed”之后完成的。 您能告诉我代码中什么地方不对吗?

预先感谢您, 兹维卡

2 个答案:

答案 0 :(得分:0)

您将需要对await的承诺。 get的{​​{1}}返回Observable,而HttpClient期望返回await

您可以使用promise函数将Observable转换为Promise。

您也可以使用toPromise()之类的PipestapcatchError来不订阅服务内部的Observable。

finalize

对于有注释的部分,即使您使用的是return this.http.get ('http://localhost:80/api/Target.xml',{ responseType: 'text' }) .pipe( tap(val => console.log("GET call successful value returned in body", val)), catchError(error => console.log("GET call in error", error)), finalize(() => console.log("The GET observable is now completed.")) ) ); ,它仍然无法正常工作,就像您在调用之后立即放置日志记录一样。

异步函数返回一个promise,您应等待然后记录该值。您可以使用toPromise()之类的then或使用另一个ReadConfiguration().then(() => console.log("Completed"))

答案 1 :(得分:0)

await应该用于等待Promise。但是,当您调用.subscribe()时,它将返回一个Subscription对象。

  

如果await运算符后面的表达式的值不是a   Promise,它将转换为已解决的Promise。

这意味着您实际上不会等到GET请求完成后,这就是为什么看到“已完成”然后显示“ GET可观察到的对象现在已经完成”的原因。