3

考虑来自http://baconjs.github.io/的这个例子

var up   = $('#up').asEventStream('click');
var down = $('#down').asEventStream('click');

var counter =
  // map up to 1, down to -1
  up.map(1).merge(down.map(-1))
  // accumulate sum
    .scan(0, function(x,y) { return x + y });

// assign observable value to jQuery property text
counter.assign($('#counter'), 'text');

如果我还有一个用于重置计数器的按钮和来自该按钮单击的事件流怎么办。如何根据重置点击流切换计数器流以重置计数器?我知道我必须使用 .flatMapLatest 方法,但是参考这个例子我不知道该怎么做。

4

2 回答 2

3

你不需要flatMapLatest这里。您可以使用功能强大且简单得多的Bacon.update,因为在此示例中,我们有一个简单的状态机。

var up    = $('#up').asEventStream('click');
var down  = $('#down').asEventStream('click');
var reset = $('#reset').asEventStream('click');

var counter = Bacon.update(0,
  [up],    function (prev, unused) { return prev + 1; },
  [down],  function (prev, unused) { return prev - 1; },
  [reset], function (prev, unused) { return 0; }
);
于 2014-12-24T20:33:16.017 回答
1

假设#reset是一个用于重置的按钮

var up   = $('#up').asEventStream('click');
var down = $('#down').asEventStream('click');
var reset = $('#reset').asEventStream('click');

var counter = reset.flatMapLatest(function () {
    return up.map(1).merge(down.map(-1))
             .scan(0, function(x,y) { return x + y });
});

counter.assign($('#counter'), 'text');
于 2014-12-24T12:34:21.657 回答