我有一个具有方法foo的服务。在方法内部,我订阅了一个可观察的(http客户端)。
foo () : boolean
{
let ret : false;
this.http.get ("/blabla").subscribe (
(resp) =>
{
ret = true;
}
return ret;
);
我喜欢从foo返回依赖于get的布尔值。这不起作用,因为http.get是异步的-return在http.get完成之前被调用。
如何使它同步?
编辑
在这里不能选择返回observable布尔值。 那是因为我处理了get in foo的响应(此处未显示),但是我还需要根据foo的返回采取行动。
EDIT2
我用管子和水龙头扩展了样品。现在,我返回服务外部的http.get-observable,并用tap处理http.get-result。
foo () : Observable <any>
{
return this.http.get ("/blabla").pipe (tap (x => handlehere ()));
}
据我所知,它只有一个丑陋之处。我有解析foo内部和外部的get-result的复杂性。我希望在foo之外使用一个简单的布尔值。
答案 0 :(得分:5)
此方法只能异步运行,因此您没有太多选择。退回烦人并订阅或退回承诺。也许答应诺言会在理解方面满足您的更多需求。
为您服务:foo方法:
%C2%A0
如何命名:
async foo() {
const result = await this.http.get("/blabla").toPromise();
// do what you want with result
return result;
}
答案 1 :(得分:1)
如果您真的必须返回布尔值,可以采用以下方法:
private ret = false;
constructor()
this.http.get("/blabla").subscribe ((resp) => {
this.ret = true;
}
}
foo(): boolean {
return this.ret;
}
采用上述方法的问题是该服务立即进行HTTP异步调用,并且再也不会进行调用,如果响应数据永不更改,则很好。这是一个缓存示例。但是,如果响应数据频繁更改,那么以上情况就不好了。
更标准的方法是返回Observable,如下所示:
foo() {
return this.http.get("/blabla")
}
并在此方法的调用中:
this.myService.foo().subscribe((resp) => {
this.ret = true;
}
在这里,每次调用this.myService.foo()
时都会发出异步HTTP请求