2016-04-26 53 views
7

我继续玩nodejs。所以下面 是我launch.js应用程序的简要异步队列从不随机触发

var counter = 0; 
var queue = async.queue(function(objectWithVariousProperties, callback) { 
    methodDoingVariousAsynchronousStuff(objectWithVariousProperties.link, function(err,result) 
     counter++; 
     callback(); 
    }); 
}, 20); 

queue.drain = function() { 
    log.debug("Finished Queue", { 
     "Objects processed" : counter 
    }); 
}; 
//TO various iterations over several array and construct some object and then push them in the queue via 
queue.push(media_object) 

我的问题是,80%的时间过程中起作用。 应用程序通过shell命令nodejs launch.js启动,处理队列,当队列结束时它显示'Finished Queue'然后返回到shell。

但是,有时候,排水事件从不触发,但应用程序结束并返回到shell,没有任何异常。 我在几个小时内检查了我的代码,以查找是否存在缺少的回调,但似乎并非如此。

任何想法可以解释这种奇怪的随机行为? 或任何有助于查找泄漏代码的工具?

正如我所说的,有时,队列处理超过10000个对象没有任何问题,有时当我启动它时,它不会触发排水事件,但过程会停止(再次没有任何异常或错误或任何事情,只是一个正常的停止)

我花了几个晚上试图找出原因,所以如果你们有任何想法,它会很乐意欢迎。

+0

可以肯定的是,当err未定义时,是否用err调用callback()?如果你没有任何错误会被吞噬,它将会失败。我还会在drain函数中记录参数对象,以防万一,它似乎没有以这种方式记录,但它可能会被一个err对象调用。 – grimurd

回答

3

我不能给你一个合适的答案,而是帮助你调试你的代码。当node.js不存在时,事件循环中还剩下一些东西。

这个工具可以帮助你找到它: https://github.com/mafintosh/why-is-node-running

我敢肯定,你的问题可能属于东西methodDoingVariousAsynchronousStuff() - 在async.queue代码看起来几乎罚款。

可能类似于未调用的回调,未处理的错误或开放的网络连接。

+0

嘿,非常感谢您的回答。这看起来非常有趣。然而,插件确实在我的情况下工作,我面临以下问题已经引用https://github.com/mafintosh/why-is-node-running/issues/12。你有其他选择吗? – Anselme

+0

不幸的不是。抱歉。 – mrcrgl

2

正如我所看到的,您不会发现一些错误。你可以添加到你的代码:

process.on('uncaughtException', function(error) { 
    console.log(error); 
}); 

我希望它会帮助你找到问题。更多信息请参阅doc

+0

非常感谢,我不知道这个事件。然而,没有出现在日志中.... – Anselme