繁体   English   中英

Angular / RxJS:同步可观察

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM