Javascript 如何在从另一个总线接收到某些内容后只启用一次进程

Javascript 如何在从另一个总线接收到某些内容后只启用一次进程,javascript,bacon.js,Javascript,Bacon.js,我需要知道如何用BaconJS实现一些东西。我需要这样的解决方案(这只是一个示例),但我只想在单击按钮后调用processBus一次。所以我需要打电话 console.log((new Date()).getTime()); 仅当单击按钮且globalBus中存在事件时。 这是我的密码: var globalBus = new Bacon.Bus(); var processBus = new Bacon.Bus(); function startProcess() { global

我需要知道如何用BaconJS实现一些东西。我需要这样的解决方案(这只是一个示例),但我只想在单击按钮后调用processBus一次。所以我需要打电话

console.log((new Date()).getTime());
仅当单击按钮且globalBus中存在事件时。 这是我的密码:

var globalBus = new Bacon.Bus();
var processBus = new Bacon.Bus(); 
function startProcess() {
    globalBus.push(new Bacon.Next());
}

processBus.skipUntil(globalBus).onValue(function() {
    console.log((new Date()).getTime());
});

setInterval(function() {
    processBus.push(new Bacon.Next());
}, 1000);
下面是JSFIDLE的示例:

我的意思是只有一次,但每次点击按钮后

这是我想要实现但没有BaconJS的示例

如果我正确理解了您的意图,那么您正在寻找一种“任务队列”机制。这是我的建议

var taskE = Bacon.fromEvent(button1, "click")
   // use flatMap to force strict evaluation
  .flatMap(function() { return new Date() })
  .doLog('task created:')

var processE = Bacon.fromEvent(button2, "click")

taskE
  // for each new task, take one "process next task" click
  // use flatMapConcat to queue tasks
  .flatMapConcat(function(task) { return processE.take(1).map(task) })
  .onValue(function(task) {
    console.log('task ', task, 'processed at', new Date());
  });

这里的工作示例:

我试图理解:您是否希望在processBus中的每个事件中运行一次副作用,但前提是在globalBus中之前有一个事件?比如,当processBus发出事件时,您希望处理globalBus包含的任何任务…是的。我只希望在globalBus中有消息后处理processBus中的一个事件,而当globalBus中有消息时,这种情况会再次发生。问题已编辑。我添加了我想要实现的示例,但没有Bacon.js,您可以使用zip而不是flatMapConcat构造,但这也会导致“进程”单击排队。我理解您的意图是只对任务进行排队,并且在没有任务时忽略“流程”单击。谢谢!非常感谢!很抱歉,我几次都不能投赞成票。我以这个解决方案结束,但您能告诉我为什么在这种情况下需要TopProperty吗?另请参阅,我担心您的实现将错过streamOne中的所有任务,而streamOne中没有任何工作。我假设您使用streamOne执行那里的任务。我也强烈建议改进命名约定:)变量的真实名称不同,因为这是一个生产代码。目前的实现是不同的,但我很高兴我学到了一些东西。非常感谢。