天天看點

Rxjs of() 和 of({}) 的差別

我最近在做 SAP Spartacus 電商雲的一個單元測試:

Rxjs of() 和 of({}) 的差別

起初我 return 的是 of(),後來發現這樣寫的話,下圖 map 操作符内的匿名函數不會觸發。

Rxjs of() 和 of({}) 的差別

我們通過單步調試即可找到原因:

Rxjs of() 和 of({}) 的差別

首先從目前的 Observable 對象裡提取出 map 操作符。每一個通過 pipe 加工過的 Observable 對象,都有一個 Operator 引用。

然後,使用這個 Operator 調用 Observable 對象。

Rxjs of() 和 of({}) 的差別

執行第28行邏輯:

Rxjs of() 和 of({}) 的差別

這裡的 this 仍然指向原始的 Observable 對象,而 array 即是輸入參數,也就是傳入 of 裡的空對象{}.

如果改成 of(), 那麼第2行的 array 為空,是以根本不會進入 for 循環,是以 map 操作符裡的匿名函數,也就沒有機會得到執行了:

Rxjs of() 和 of({}) 的差別

每個 map Operator 都維護了一個 project 屬性,指向 map 調用時傳入的匿名函數:

Rxjs of() 和 of({}) 的差別

現在就執行到我的匿名函數了:

Rxjs of() 和 of({}) 的差別
Rxjs of() 和 of({}) 的差別

繼續閱讀