Node.js中的异步编程模式:nextTick和setImmediate区别

9

我有一个使用async.js模块的大型node.js应用程序。

我的许多代码都像这样:

async.series([
    function(callback){
        sql.update(query, callback);
    },
    function(callback){
        if (something){
            sql.update(query2, callback);
        }
        else{
            callback(null);
        }
    }

大问题在于else语句中的同步回调。我曾经读到过不要在async.js中这样做,因为它可能会导致意外的结果,但是我不确定最好的替代方案是什么。我读到有些地方应该使用process.nextTick,但现在我又读到我们不应该使用它,而应该使用setImmediate。

能否有人指点一下我?谢谢!


你能提供一下你读到的不应该这样做的链接吗?我没有看到过这方面的问题。这是异步应该被使用的方式。当函数执行完成后,你会回调。接下来的函数将不会运行,直到回调被调用。 - mshell_lauren
我希望我能找到它。我一段时间前读过它。我知道回调需要被调用,但我认为它应该被包装在我提到的某个函数中,以使对回调的调用异步化。我们确实有一些奇怪的东西。不确定是来自这里还是其他什么地方,但想着我会删除任何可能成为问题的东西。 - Christie
我不认为这是“错误的方向”..问题应该是其他什么地方..如果没有错误,callback的第一个参数应该为null,否则.series调用将以错误退出。尝试使用console.trace()、断点和更多输出进行调试。 - Gntem
我同意@Phoenix的观点,我不认为这是你的问题。回调函数没有被包装在异步调用中并不会有任何影响。无论如何,回调函数都将作为同步操作被调用。发生这种情况的时钟并不重要。我建议加入一些日志来查看实际发生了什么。也许可以看看sql操作中回调函数的调用方式。 - mshell_lauren
我应该明确表示,这里没有一致的错误。我知道如何修复那些错误 :) 时不时地,事情并不顺利。它不容易被复制,并且发生在不同的地方。 - Christie
显示剩余2条评论
1个回答

6

我最终找到了我记得一段时间前读过的参考资料。

它在这个页面上: http://caolanmcmahon.com/posts/nodejs_style_and_structure/

在规则#3中,他讨论了一般情况,在响应页面上的第一条评论时,他更直接地涉及到了我的问题。

即使它不是我随机错误的原因,我也想按照作者的意图使用该模块,这也是我的问题所在。

在这篇文章中,他提到了使用process.nextTick,但我真的认为在这种情况下,Node正在尝试远离它。一个月前在一个异步问题线程中,我发现了一个答案,它说:

“你需要确保你的函数是异步运行的-如果你不知道它是否是异步的,你可以使用setImmediate强制其异步”

所以,这就是我要去的答案。 我将用setImmediate包装任何同步回调。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接