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

Bacon Bus weird behaviour with end of stream event

本文关键字:结束 事件      更新时间:2023-09-26

这很好用:

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);

事实上,那里有一个回调,这让我非常恼火。所以上面的实际解决方案非常好

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