簡體   English   中英

Bacon.js,將流中的每個值延遲1秒

[英]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 :處理每個事件並在給定延遲后將其觸發。

沒有額外的功能可以同時進行延遲和緩沖, throttledebounce會吞噬發生得太快的事件。

您可以做的是:

  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM