培根巴士奇怪的行为与流结束事件

时间:2014-04-17 20:06:02

标签: javascript reactive-programming frp bacon.js

这很好用:

var Bacon = require('baconjs');

var a = Bacon.fromArray([1,2,3])

a.onValue(function(val){
  console.log(val)
})

a.onEnd(function(){
  console.log("END")
})

...意味着onValue和onEnd被正确调用,这就是结果:

1
2
3
END

这不起作用(至少我)预期:

var Bacon = require('baconjs');

var bus = new Bacon.Bus();

var a = bus.flatMap(function(){
  return Bacon.fromArray([1,2,3])
})

a.onValue(function(val){
  console.log(val)
})

a.onEnd(function(){
  console.log("END")
})

bus.push(1)

...意味着在这种情况下'onEnd'没有被调用,结果就是:

1
2
3

是否有原因,解决方案是什么?

更新

这正是我最终需要的:

var Bacon = require('baconjs');

var a = Bacon.fromArray([1,2,3])
            .fold(0,function(a,b){return a+b;})
            .filter(function(val){ return val > 0 });


var bus = new Bacon.Bus();


var ff = bus.flatMap(function(){
  return Bacon.combineTemplate({status:true, result:a});

});

ff.onValue(function(val){
  console.log(val)
    setImmediate(function(){
    bus.push(3)  
  })

})

ff.onEnd(function(){
  console.log("END")

})


bus.push(3)

基本上我需要知道总线何时结束,以便我可以向数据库询问另一块记录,依此类推。 问题是没有总线上的“结束”信号就无法工作。虽然这样的事情有效:

var Bacon = require('baconjs');

var bus = new Bacon.Bus();

bus.onValue(function(){

  var a = Bacon.fromArray([1,2,3])

  a.onValue(function(val){
    console.log(val)
  })

  a.onEnd(function(){
    console.log("END")
  })

})

bus.push(1);

有一个回调的事实让我感到厌烦。所以上面的实际解决方案非常好

1 个答案:

答案 0 :(得分:1)

那是因为总线没有结束:你仍然可以将更多事件推送到总线。总线结束时唯一的情况是在总线上调用end()方法。