【发布时间】: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