【问题标题】:Node event emitter with condition带条件的节点事件发射器
【发布时间】:2016-01-17 15:39:57
【问题描述】:

我有节点应用程序,它在我可以运行其他逻辑时引发事件,例如 server.js 将在它启动时发出事件(例如......),然后我有应该在此事件之后运行的逻辑被养了

第一个文件

server.js -> runProcess -> 完成 -> 发出事件

第二个文件

监听事件 -> 运行新进程

问题是 firstFile/server.js 只运行一次,secondFile 可以多次运行,所以第一次它工作正常,但第二次事件丢失,代码不会被称为...

这里将第一次调用它,我需要在事件可用时第一次调用它

但是对于第二个文件中可以多次调用的 proxy.web 所以第二次它失败了,因为事件不再从第一个没有被调用的文件中引发......,我该如何克服这个?

 Actions.eventEmitter.on('Available', function () {
            proxy.web(req, res, {
                target: 'http://' + hostname + ':' + appPort
            });

    })

【问题讨论】:

  • 事件只触发一次,并且只有在触发时才会触发回调。您可以尝试改用 Promise。即使在完成后它们也会触发回调。只需注册一个完成承诺的事件处理程序并将所有回调添加到该承诺。
  • @SpiderPig - 我使用 bluebird 但不知道如何在这里使用 Promise 以及它有什么帮助,您能提供示例吗?
  • 事件是短暂的,不是有状态的。你需要某种信号量系统。为了响应事件,需要永久更改状态,并保留在以后的事件处理程序的范围内。 Promise 确实以正确的方式是有状态的(一旦确定,它们就会保持稳定),但会矫枉过正。你所需要的只是 Promises 的“回调队列”方面——观察者模式,它允许在某个时候添加和触发成功/错误回调。 jQuery 以jQuery.Callbacks 的形式公开了这一方面。我确信代码可以从源代码中抄袭。

标签: javascript node.js promise bluebird eventemitter


【解决方案1】:

你可以使用 Promise 来解决这个问题。 在 server.js 中添加此代码。

Actions.promiseAvailable = new Promise(function(resolve, reject) {
  Actions.eventEmitter.on('Available', function() {
    resolve();
  });
});

然后在你的第二个文件中你可以这样做

Actions.promiseAvailable.then(function() {
  //doSomething
});

缺点是你必须为你可能得到的每种类型的事件添加另一种方法。

【讨论】:

  • 谢谢,但是 server.js 文件(首先)需要发出事件而不是监听(on)它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多