2014-12-07 52 views
1

我想用bacon.js製作一個簡單的網頁。它應該有一個按鈕,通過鼠標點擊來切換布爾狀態。 設置流之後,應該通過將對象發送到init流來初始化應用程序。在這裏,我只是發送切換所需的初始布爾狀態(false)。 的代碼看起來像這樣(我僞造了點擊按鈕和初始化):如何使用scan()更清晰

// Helper function 
var neg = function (a) { return !a; }; 

// Fake of initialization stream. End after one element 
var init = Bacon.sequentially(500, [false]); 
// Fake of button click event stream. 
var click = Bacon.repeatedly(1000, [{}]); 

var toggle = init.concat(click).scan(null, 
    function(a, b) { return a === null ? b : neg(a); }).skip(1).toEventStream(); 

toggle.log(); 
// Output: false, true, false, true, .... 

上面的代碼(jsFiddle)按預期工作,但我不喜歡的是,toggle流創建線是如此複雜。

如果有可能省略種子值(把它從流),如果scan返回EventStream而不是Property的,我可以這樣寫:

var toggle = init.concat(click).scan(neg); 

這可以讀更好。或者,如果有可能給種子如流,我可以這樣寫:

var toggle = click.scan(init, neg); 

你有什麼建議,使代碼更清楚了嗎? 有沒有其他解決方案使用scan? 我應該讓我自己的scan方法?

回答

1

如果您閱讀我以前寫過的內容,請忽略。它。 :)這種情況正是flatMap的用途:創建流的流。使用flatMap。

// Helper function 
var neg = function (a) { return !a; }; 

// Fake of initialization stream. End after one element 
// Note the use of `later` instead of `sequentially`, by the way 
var init = Bacon.later(500, false); 

// Fake of button click event stream. 
var click = Bacon.repeatedly(1000, [null]); 

var toggle = init 
    .flatMap(function(initVal) { return click.scan(initVal, neg) }); 

toggle.log(); 
+0

我想你想使用'flatMap' – Bergi 2014-12-08 01:18:25

+0

你是對的Bergi。我意識到這一點,因爲我昨晚躺在牀上。 :) – chreekat 2014-12-08 06:34:03