2017-02-20 70 views
16

我想利用angular2中的observables,並弄糊塗爲什麼我應該使用map()over subscribe()。 假如我是從現在的WebAPI使用subscribe(success, error, complete)我可以得到成功回調的所有值,我可以在完成回調返回值獲取值,這樣爲什麼我們應該在angular2上使用subscribe()over map()?

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 

。如果我可以完成所有這些功能,那麼map()的需求是什麼?它有什麼優勢嗎?

總之,爲什麼要這樣寫

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 
    .map(r=>{}) 
    .subscribe(value => { 
    }, error => error,() => { 
}); 

時,他們可以簡單地寫這個沒有地圖功能:

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 
    .subscribe(value => {   
    }, error => error,() => {   
}); 
+0

訂閱和地圖是彼此完全不同的一個很好的文檔,請通過我已經更新了我的問題的文件 –

+0

,請有看看它 –

+1

.map(r => {})將導致未定義的值。請以合理的方式解釋你的案子,如果你正在尋找合理的答案。 – estus

回答

25

如果你想返回一個Observable其他一些代碼可以訂閱,但您仍然想要操作當前方法中的數據事件,請使用map

observable的實際用戶需要subscribe(),因爲如果沒有subscribe(),observable將根本不會執行。 (forEach()toArray()和可能其他工作,以及執行觀察到的,而不是subscribe()

subscribe()返回Subscription不能預訂,但它可以被用來取消訂閱。

map()返回Observable可訂閱。

7

您需要subscribe來運行您的異步請求。如果您只設置了map - 不會觸發任何請求。你可以檢查。

很好的做法,使用map到preproccess你的數據,因爲許多用戶可以comsume結果。因此,不用爲每個客戶端(訂戶)添加預處理,您都可以爲單個數據模式準備單個輸出。

13

思考地圖作爲變換的響應的中間件。

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 
.map(r=>r.json()) 
.subscribe(result => { 
       // here result would have json object that was parsed by map handler... 
      },failurCallback,completeCallback) 

訂閱用於調用可觀察的,請閱讀cold-vs-hot-observables

+0

感謝您的幫助 –

相關問題