2017-08-15 106 views
0

我刚开始在Angular 2中实现应用程序。我对下面的代码有一些疑问。为什么在该验证方法中返回Observable而不是布尔类型?如果我查看专家的源代码,他们大多数将返回为Observable。我担心这可能是个愚蠢的问题,但我对此很好奇。为什么返回类型Observable比原始类型好?

authenticate(user: string, pass: string): Observable<boolean> { 
     return this.http.request(new Request({ 
      method: RequestMethod.Post, 
      url: this.baseUrl + "login", 
      body: { name: user, password: pass } 
     })).map(response => { 
      let r = response.json(); 
      this.auth_token = r.success ? r.token : null; 
      return r.success; 
     }); 
    } 

回答

0

在函数内调用的http请求是异步的,这意味着响应可能需要一段时间才能达到客户端。观察者给你等待回应并执行某些事情的特权。

例如:比方说,你将返回该直接中科院布尔,你总是会得到空值,因为该函数的HTTP请求不等待响应返回它。

+0

真的吗?但我曾经实现在我非常古老的测试中返回布尔类型。它工作正常,不返回空值... –

+0

执行你的程序时,如果响应出现在返回行之前,那么你将有一个布尔值。这取决于你的网络的速度,也许在本地开发环境中你不会注意到这个问题。如果你认为这不是很清楚,你可以分享你的代码来澄清更多。这是一些[Observables](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html) –

+0

我明白了,谢谢你的解释。 –

1

你会注意到,在几乎所有带有http请求的方法中,它们都会返回observable。

这是因为Http请求(网络)请求是固有异步的。意思是,当你提出网络请求时,你不知道什么时候在调用堆栈中处理响应。响应取决于网络速度,API效率,干扰等。

为什么观测量?他们已订阅!您在回复完成时订阅他们。 Rxjs带有大量的操作员,可以对响应进行分析,或者出现错误,提供更清晰和更愉快的体验。

我建议通过一些在线发现的Rxjs示例。观察对象是超级强大的。他们可以管理你的应用程序的状态,数据访问层,视图以及其间的所有内容。

检查rxjs网站的文档和视觉效果上都RX。 http://reactivex.io/

+0

你能提供很好的例子吗? –

+0

https://embed.plnkr.co/eRaCT7AqNNPIHpD3sCG0/。这导入了rxjs,因此您可以在script.js页面中执行任何您想要的rxjs练习。或者是更友好的打字稿版本:http://embed.plnkr.co/OdggjhnwjQLSwhYAjg8H – Everett

0

说这是一个可观察让它有点说“最终我们也会有这样类型的值回来了”。它允许随着时间流逝的价值流,这就是为什么它最好用于每个异步http请求。 map函数也返回一个observable,所以试图直接返回一个布尔值将需要一些不必要的工作。地图(...)优于.promise()。然后(...)