Javascript 如何分叉/复制流

Javascript 如何分叉/复制流,javascript,ruby-on-rails,node.js,bacon.js,Javascript,Ruby On Rails,Node.js,Bacon.js,我有一个outer流。我想用两种不同的方式使用这个流。 第一种方法就是倾听价值观。 第二种方法是使用flatMapConcat构建一个新流 但我不能同时做这两件事。我想我必须分叉或复制这条小溪 我试着增加一辆公共汽车,但没有用 var outer = Bacon.fromArray([1, 2, 3, 4, 5]); // 1.way build a new stream var combined = outer.flatMapConcat(function(v) { return Ba

我有一个
outer
流。我想用两种不同的方式使用这个流。 第一种方法就是倾听价值观。 第二种方法是使用
flatMapConcat
构建一个新流

但我不能同时做这两件事。我想我必须分叉或复制这条小溪

我试着增加一辆公共汽车,但没有用

var outer = Bacon.fromArray([1, 2, 3, 4, 5]);


// 1.way build a new stream
var combined = outer.flatMapConcat(function(v) {
  return Bacon.sequentially(1000, ["a" + v, "b" + v]);
});


// 2. way use the plain stream
// outer.onValue(function(v) { console.log(v); });

// Tried to insert a bus
var forkBus = new Bacon.Bus();

forkBus.plug(outer);

forkBus.onValue(function(v) {
console.log('outer side' + v);
});

combined.take(3).log();
如何分叉/复制流,以便以两种不同的方式使用它?

问题在于向事件流注册订阅者,并且由于在您的示例中,您的流已经被缓冲并准备就绪(因为您使用了
fromArray()
),因此流立即被调度到新订阅者并被消耗到最后。如果您尝试设置
组合的
流并首先对其调用
.log()
,则会出现相同的问题

有关这方面的提示,请参阅文档:

创建一个EventStream,该EventStream提供给定的一系列值(给定 作为阵列)发送到第一个订户。流在这些值之后结束 已经交付

事实上,如果您的事件流来自连续/随机的事件(如用户输入或单击事件),则您的代码通常能够在任何事件实际发生之前设置具有所需订户或子流的流,如:

var outer = $('#some-number-input').asEventStream('input')...;

outer.onValue(function(v) { console.log(v); });

var combined = outer.flatMapConcat(function(v) {
    return Bacon.sequentially(1000, ["a" + v, "b" + v]);
});

combined.take(3).log();

// After this point, any event that occurs in `outer` will pass
// through both functions
如果希望在不修改流的情况下对流执行某些操作(并且不注册订阅服务器,这将消耗流),可以使用:


您还可以使用一个简单的
.delay(0)
var outer = Bacon.fromArray([1, 2, 3, 4, 5]);

var actioned = outer.doAction(function(v) {
    console.log(v);
});

var combined = actioned.flatMapConcat(function(v) {
    return Bacon.sequentially(1000, ["a" + v, "b" + v]);
});

combined.take(3).log();