2017-08-15 69 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()。然後(...)