[英]Bacon.js, delay each value in the stream by 1 second
我有這個:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.flatMap(putValInCouchDb)
我需要緊接過濾器之后才能將整個流延遲1秒,然后運行putValInCouchDb確實像這樣:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.delay(1000)
.flatMap(putValInCouchDb)
但是我想我丟失了一些東西,因為.delay(1000)將所有內容延遲了多少秒,然后在所有時間過去之后將其全部運行。
有任何想法嗎 ?
更新
只是根據亞歷克斯的答案進行澄清
我需要的是:
1 "filter" 1
2 "filter" 2
3 "filter" 3
4 "filter" 4
[waits 1 second]
1004 "flatMap" 1
[waits 1 second]
2004 "flatMap" 2
[waits 1 second]
3005 "flatMap" 3
[waits 1 second]
4006 "flatMap" 4
更新2-使用解決方案
從Bergi的答案來看,使用帶有間隔的.zip實際上是可行的,但是.zip發生的事情是.interval每秒創建一個事件,然后.interval中的每個事件都等待數據庫檢查中的每個事件。 許多數據庫檢查都是大量且非常快速地進行的,因此會發生“過度緩沖”(這是培根文檔警告您的內容)。
因此,我決定以這種方式進行操作:
var bulk = array[1,2,3,4]
var finalResult = Bacon
.fromArray(bulk)
.flatMap(isValInCouchDb)
.filter(onesThatExist)
.fold([], function(a, b){ a.push(b); return a })
.flatMap(function(a){return Bacon.sequentially(1500, a)})
.flatMap(putValInCouchDb)
這很有效,因為折疊過濾后的結果並從中順序創建事件是自然的,非常具有描述性的,並且沒有副作用。
培根很棒
除非您在putValInCouchDb
中做一些花哨的東西, putValInCouchDb
您的代碼似乎可以按照您希望的那樣正常工作。 例如,跑步
var t = new Date().getTime();
function timestamp(label, x) { console.log(new Date().getTime() - t, label, x); }
var s = Bacon.fromArray([1,2,3,4])
.filter(function(x) { timestamp("filter", x); return true })
.delay(1000)
.flatMap(function(x) { timestamp("flatMap", x); return Bacon.constant(x) })
s.onValue(function(x) {})
輸出類似
1 "filter" 1
2 "filter" 2
3 "filter" 3
4 "filter" 4
[waits 1 second]
1004 "flatMap" 1
1004 "flatMap" 2
1005 "flatMap" 3
1006 "flatMap" 4
.delay(1000)會將所有內容延遲多少秒,然后在所有時間過去之后將其全部運行。
是的,這就是應該執行的delay
:處理每個事件並在給定延遲后將其觸發。
沒有額外的功能可以同時進行延遲和緩沖, throttle
和debounce
會吞噬發生得太快的事件。
您可以做的是:
Bacon.sequentially
使用Bacon.sequentially
。,您可以傳遞1s間隔,而不是普通的Bacon.fromArray
來構造流 使用zip
將現有事件流加入到在預期時間發生的事件:
Bacon.fromArray(bulk)….zip(Bacon.interval(1000), _.id)
我不確定您的.flatMap(isValInCouchDb)
如何操縱流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.