以下代码用于异步获取文件。 此方法属于服务。 从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”之后完成的。 您能告诉我代码中什么地方不对吗?
预先感谢您, 兹维卡
答案 0 :(得分:0)
您将需要对await
的承诺。 get
的{{1}}返回Observable,而HttpClient
期望返回await
。
您可以使用promise
函数将Observable转换为Promise。
您也可以使用toPromise()
之类的Pipes
,tap
和catchError
来不订阅服务内部的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可观察到的对象现在已经完成”的原因。