Angular / RxJS:同步可观察

时间:2018-09-24 18:25:45

标签: angular rxjs

我有一个具有方法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之外使用一个简单的布尔值。

2 个答案:

答案 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请求