2017-05-25 57 views
1

爲例子,我有以下的代碼,我可以用兩種方式寫:rxjs - 什麼是從結果的角度的差異做。做())的行動和.subscribe(

1. 
ObsevableA.do(() => { 
    doSomething(); 
}) 
.subscribe(); 

2. 
ObservableA.subscribe(() => { 
    doSomething(); 
}); 

結束結果似乎是一樣的。對每種方法有任何想法?我應該使用的最佳做法是什麼?謝謝。

+0

https://egghead.io/lessons/rxjs-move-important-side-effects-from-do-to-subscribe 我最初的想法與它在這裏所說的相似。如果doSomething()方法執行一些會影響應用程序流的業務邏輯,那麼我應該使用2.方法? .do()主要用於執行記錄等副作用操作。但我感興趣的是其他人使用.do() –

+0

訂閱有下一個,錯誤和完整的功能。我只用在中間進行故障排除和執行一些副作用,如顯示spinner..Plus 1)寫的更長;-) –

回答

1

我總結成幾個要點:直到調用subscribe()

  1. 可觀察鏈不發出任何東西。

  2. 您可以致電subscribe()不帶參數的同時do()總是需要有至少一個參數(因爲沒有點使用do()沒有任何處理)。

  3. 如果您的連鎖店發送錯誤,並且您未設置任何錯誤處理程序subscribe()調用錯誤將被重新拋出。這不適用於.do(),因爲它只是將所有內容都傳遞過去,而不需要其他邏輯。

一般來說,建議使用do()只執行副作用和調試您的可觀測鏈。 do()的好處是你可以將它放在任何你想要的位置,但是你應該避免使用它來進一步修改鏈條值。

例如,你不應該做這樣的事情:

let sum = 0; 

Observable.range(1, 3) 
    .do(val => sum += val) 
    .concat(Observable.of({ total: sum})) 
    .subscribe(console.log); 

此打印:

1 
2 
3 
{total: 6} 

當你可以在多個RX的方式把它寫:

Observable.range(1, 3) 
    .publish(shared => Observable 
     .merge(shared, shared.reduce((acc, x) => acc + x, 0).map(sum => { return { total: sum }; })) 
    ) 
    .subscribe(console.log); 
+0

我不認爲你需要將任何參數傳遞給.do()。 Do操作符是否執行map()以返回場景後面的輸入值。 –

+0

@ schrodinger'scode您必須將至少一個參數傳遞給'do()'。你可以在這裏檢查一下https://github.com/ReactiveX/rxjs/blob/master/src/operator/do.ts#L8。此外,它並沒有在內部使用map(),因爲map()將回調調用封裝在try-catch塊中,最終將異常作爲錯誤信號傳播。你顯然不想使用'do()',它只能調用副作用,根本不用修改鏈。 – martin

+0

不,假設任何人都可以做一些根本不修改鏈的東西(),但這並不意味着你應該使用do操作符來做到這一點? –

0

do()返回一個輸出可觀察值,並且不消耗來自源觀察值的值。您可以將其用於反應鏈中的副作用。

subscribe()返回一個訂閱並確實消耗源observable的值。您可以在反應鏈的末尾使用它來處理計算結果。返回的訂閱對象有一個dispose()方法,您可以調用它來取消訂閱所有的觀察對象。