[英]Angular/RxJS: synchronous observable
我有一个方法foo的服务。 在方法内部,我订阅了一个observable(http-client)。
foo () : boolean
{
let ret : false;
this.http.get ("/blabla").subscribe (
(resp) =>
{
ret = true;
}
return ret;
);
我喜欢从foo返回一个取决于get的布尔值。 这是行不通的,因为http.get是asynchrouns - 在http.get完成之前调用return。
我怎样才能使这个同步?
编辑
返回observable而不是boolean不是一个选项。 那是因为我处理了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之外的一个简单布尔值。
此方法只能异步运行,因此您没有很多选项。 返回obsersable并订阅或返回一个承诺。 也许回归承诺会在理解方面满足您的需求。
在您的服务中:foo方法:
async foo() {
const result = await this.http.get("/blabla").toPromise();
// do what you want with result
return result;
}
怎么称呼它:
this.myService.foo().then( (result) => {
// Do what you want with the result
});
如果你真的必须返回一个布尔值,这是一种方式:
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请求
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.