在下面的代碼,我有一個很難理解的鏈式調用的順序是: 調用的可觀察代碼的順序是什麼?
function registerDomain(caseWebsiteUrl) {
return this._adminService.registerDomain(caseWebsiteUrl.Url)
.concatMap(registerId => Observable.interval(5000)
.mergeMap(() => this._adminService.getChange(registerId))
.takeWhile((info) => info.ChangeInfo.Status.Value !== 'INSYNC')
)
}
registerDomain.subscribe(res => console.log('res:'+res));
我試圖理解上面的代碼,但我有很難理解的順序。這是我更容易理解,當我看到一個更簡單的例子是這樣的:
function registerDomain() {
return register()
.concatMap(registerId => Rx.Observable.interval(5000)
.mergeMap(() =>
getChange(registerId))
.takeWhile((info) => info === 'PENDING')
);
}
registerDomain().subscribe(x=>console.log(x));
function register()
{
return Rx.Observable.of("registerId");
}
function getChange(registerId)
{
//at some point this will return INSYNC
return Rx.Observable.of("PENDING");
}
當我看到這個代碼,我看它的方式是:
- 通話記錄()返回可觀察
- 將getChange()和takeWhile合併爲一個可觀察對象
- 將getChange和TakeWhile的合併結果與間隔Observable連接起來。
- 呼叫getChange每5秒鐘,直到狀態!== '待定'
是我的上述評估是否正確?你怎麼知道什麼時候使用合併或concat?
如果我想捕獲錯誤,例如,register()拋出一個錯誤,那麼它應該失敗。
基於@馬克麪包車Straten的回答,一些額外的問題:
所以,如果我想維持秩序,我應該使用concatMap?在這種情況下,我希望registerDomain在調用getChange之前完成?
如果我不關心順序,那麼使用mergeMap?
在getRegisterStatus方法中,它究竟在哪裏合併?爲什麼不使用concatMap?
concatMap確實是保序。該代碼假定您希望在開始輪詢註冊表中的更改之前完成「registerDomain()」。如果不是這種情況,可以將它合併到一起,但'getChange'依賴於'registerDomain()'返回的'registerId'。 getChange的mergeMap()是因爲'adminService.getChange()'很可能會返回'Observable'或'Promise ',您需要將其平鋪到主流中。 –