2012-02-09 60 views
0

我调用了一个函数,它可以堆栈两个异步调用并在它们都完成时调用回调。
我正在使用一种非常简单的方法来跟踪尚未完成的调用

lock ++
lock -

问题是程序在两个函数的操作完成之前退出。我注意到这是我调试时遇到的问题,并在退出之前让流程完成。

我该如何解决这个问题? (此刻我在一个位上如何准确解释我的问题,请叫我什么,你需要这样我就可以澄清问题的损失)节点JS过早程序结束

-----编辑

随着脚本下面为什么当我运行它只是退出?我认为通过调用我注册到事件队列并且脚本应该继续运行?

var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 

eventEmitter.on('spo',function(){ 
console.log('spo'); 
}); 
+8

发布一些示例代码? – jergason 2012-02-09 02:25:42

+1

您可以尝试使用https://github.com/caolan/async。做同样的事情。 – 2012-02-09 03:18:53

回答

0

COMING From a Git Hub thread.

是什么让事件循环活着手柄(插座,定时器等)的脚本都没有。

EventEmitter实例是同步的 - 也就是说,它们立即运行 - 因此在您的示例中,一旦事件触发,脚本就完成了。

认为它是这样的:本身就是一个EventEmitter是没有用的,当它绑的东西,发出有趣 事件(从网络或文件系统中, 到期定时器数据只 变得有用,等等。)。

我认为他们所说的是,它是节点之外的控制台,将C脚本打开。

0

问题是,你设置了一个事件发射器并附加一个处理程序到“spo”事件,然后你什么都不做。所以节点运行时间看到没有什么可以做和退出了。试试这个:

eventEmitter.on('spo', function() { 
    console.log('OK: got event "spo"'); 
}); 
eventEmitter.emit('spo'); 
+0

它运行回调然后仍然退出。我理解它的方式是,只要有一个注册监听器,事件循环就不会退出!如果我想要某些功能类似于http.listen(),该怎么办?这使脚本继续运行。 – Prospero 2012-02-09 20:07:54

+0

setInterval(function(){},500);将保持运行,但我觉得这不应该需要。 – Prospero 2012-02-09 20:11:32

+0

@JamesAndino:对,如果你使用'setInterval()',那么节点知道某些东西可能在将来发出事件,因为事件队列中有东西;但是,当事件队列为空时,它只是退出。我想像'httpServer.listen()'这样的函数向事件队列中添加一个“永久”条目,以便节点不会退出,但不确定具体细节。 – maerics 2012-02-09 20:20:49