在特定的時間內產生Observable值的最習慣方法是什麼?例如,假設我有一個由大數組創建的Observable,我希望每2秒產生一個值。 interval
和selectMany
的組合是最好的方法嗎?在RxJS中按特定時間量分開可觀察值
12
A
回答
20
對於您的具體例,想法是,從陣列中的每個值映射到可觀察到的一個延遲之後,將產生其結果,則級聯所得到的觀測值的流:
var delayedStream = Rx.Observable
.fromArray([1, 2, 3, 4, 5])
.map(function (value) { return Rx.Observable.return(value).delay(2000); })
.concatAll();
其它實例可能確實利用timer
或interval
。這取決於。例如,如果你的數組真的非常大,那麼上面的內存會造成相當大的內存壓力(因爲它創建了一個非常大的N
觀測值)。下面是一個使用interval
到懶惰地行走陣列的替代:
var delayedStream = Rx.Observable
.interval(2000)
.take(reallyBigArray.length) // end the observable after it pulses N times
.map(function (i) { return reallyBigArray[i]; });
這一個將來自陣列每2秒,直到它已經重複了在整個陣列上產生的下一個值。
6
雖然布蘭登的回答得到了主意,但這是一個立即生成第一個項目的版本,然後在以下項目之間放置時間。
var delay = Rx.Observable.empty().delay(2000);
var items = Rx.Observable.fromArray([1,2,3,4,5])
.map(function (x) {
return Rx.Observable.return(x).concat(delay); // put some time after the item
})
.concatAll();
更新了新的RxJS:
var delay = Rx.Observable.empty().delay(2000);
var items = Rx.Observable.fromArray([1,2,3,4,5])
.concatMap(function (x) {
return Rx.Observable.of(x).concat(delay); // put some time after the item
});
17
我覺得用拉鍊生產更好,更可讀的代碼,仍然只用3觀測。
var items = ['A', 'B', 'C'];
Rx.Observable.zip(
Rx.Observable.fromArray(items),
Rx.Observable.timer(2000, 2000),
function(item, i) { return item;}
)
+0
到目前爲止最佳回答 – gropapa
4
同意zip是一種乾淨的方法。下面是可重複使用的函數來生成的間隔流爲一個數組:
function yieldByInterval(items, time) {
return Rx.Observable.from(items).zip(
Rx.Observable.interval(time),
function(item, index) { return item; }
);
}
// test
yieldByInterval(['A', 'B', 'C'], 2000)
.subscribe(console.log.bind(console));
此基礎上farincz's answer,但是通過使用作爲.zip
實例方法稍短。
此外,我使用Rx.Observable.from()
,因爲Rx.Observable.fromArray()
是deprecated。
4
對於RxJS 5:
Rx.Observable.from([1, 2, 3, 4, 5])
.zip(Rx.Observable.timer(0, 2000), x => x)
.subscribe(x => console.log(x));
0
相關問題
- 1. RxJs可觀察分頁
- 2. RxJs可觀察vs
- 3. RXJS鏈條可觀察量在任何時間點完成
- 4. RxJS可觀察的過濾和分組
- 5. 從setTimeout(Rxjs)返回可觀察值
- 6. RxJs使用WebSocket可觀察
- 7. RxJS結合可觀察
- 8. Split RxJS可觀察輸出
- 9. 角 - rxjs可觀察陣列
- 10. RxJS結合觀察值
- 11. Rxjs:從值或可觀察值創建可觀察值的速記
- 12. Rxjs觀察員
- 13. 創建可觀察的並獲得觀察者在RXJS 5.0中
- 14. RxJS - 可觀察模塊 - 扔不確定
- 15. RXJS可觀察到的缺失定義
- 16. RxJS可觀察重置超時
- 17. RxJS:鏈式觀察量不使用相同的根可觀察值
- 18. 錯誤時間間隔RXJS/react-native(可重複觀察)
- 19. 如何在錯誤時恢復RxJs可觀察間隔
- 20. 如何在零時間內獲得RxJS可觀察事件?
- 21. RxJs直到達到期望值的可觀察間隔
- 22. Trxy蒸汽可觀察合併在rxjs
- 23. 簡單的觀察到/觀察員rxjs
- 24. 在可觀察的數組中增加單獨的值 - RxJS
- 25. 根據特定條件在RxJs中加入兩個可觀察對象流
- 26. RxJS:可觀察對象和單觀察者的遞歸列表
- 27. RxJS如何在可觀察對象之間切換和暫停?
- 28. angular2,RxJs過濾器可觀察結果?
- 29. RxJS:延遲可觀察項的生成
- 30. 鏈式rxjs可觀察的運營商
注意'現在return'是'of':https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md –
現在,這可能是'concatMap'(猜測concatMap比2014年更新?)。這只是將它們全部排在一起(否則它們全部在一起延遲後) –
例如。 '.concatMap(x => Observable.of(x).concat(Observable.empty()。delay(5000)))' –