問題:我想創建Rxjs組合(函數鏈),它將導致從一個Observable中緩衝值,直到發生某些事件,然後同步發送所有緩衝值,然後緩衝直到下一個事件。RxJS:在某個事件發生後緩衝區發出
我使用這個函數來收集所有的http請求,這些請求必須等到我的應用程序進行授權調用。然後運行所有這些請求。 (它在Angular4 HttpClient攔截器中實現),這是我的用例,但我通常尋求如何創建這種rx鏈的解決方案。
爲什麼Rxjs緩衝區不受歡迎。從我讀取和測試的緩衝區中,要麼需要精確的時間幀,要麼在獲取調度程序而不是時間作爲參數的情況下,在檢測到最後一個調度程序的「事件」傳播後重新訂閱調度程序。我希望它像這樣工作:當出現第一個請求時,我開始緩衝,然後訂閱調度程序,在調度程序發出後,停止緩衝,重新發送所有緩衝值,並等到下一個新請求再次開始緩衝並且再次啓動調度程序。
我現在的解決方案是使用輔助對象,這就是未定義或我觀察到,與代碼大致如下:
private observable: Observable<boolean>;
makeRequest(): Observable<boolean> {
if (this.observable !== void 0) {
return this.observable;
} else {
this.observable = this.authenticationReuqest()
.share()
.finally(() => this.observable = void 0);
return this.observable;
}
}
這樣一來我有點緩衝答應我的請求,由maiking他們.delay(),直到同樣的多播可觀察發射,並且在它發射之後,我只是將其清理乾淨(雖然在完成或錯誤之後不需要取消訂閱,因爲它最終清除了)。
如果任何人有一個想法或模式如何用純Rxjs替換此解決方案,我intrested。我有些感覺,儘管我無法得到確切的解決方案,但是Buffer和Zip的一些組合可以實現。
感謝 托馬斯
'buffer()'運算符不會重新訂閱它的通知程序。我認爲你在這裏描述的是「緩衝」操作符現在是如何工作的。 – martin
@martin如文檔http://reactivex.io/documentation/operators/buffer中所述。html緩衝區時需要一些描述時間窗口的參數(無論是時間窗口還是其他可觀察窗口)都有一個接一個的時間框架。 我的第二個可觀察的是Http請求。我想在等待這個請求時緩衝。當我得到第一個無緩衝的值和緩衝區值直到這個http請求結束時,我想發送這個請求。 –
我認爲緩衝區允許做的是有一個由Observable定義的時間框架,但它不允許緩衝源和這個時間框架之間的任何交互提供可觀察的。 如果您只是使用緩衝區功能簡單實現它的確切示例,我將非常樂意看到它。 –