node.js async.js nextTick vs setImmediate

Posted

技术标签:

【中文标题】node.js async.js nextTick vs setImmediate【英文标题】: 【发布时间】:2014-04-26 05:14:51 【问题描述】:

我有一个大量使用 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。

有人能指出我正确的方向吗?谢谢!

【问题讨论】:

你能链接到你读到的不应该这样做的地方吗?我没有看到它有问题。这是应该使用异步的方式。当你完成了你回调的函数的执行。调用回调之前,后续函数不会运行。 我希望我能找到它。我不久前读过它。我知道需要调用回调,但我认为它应该包含在我提到的函数之一中,以异步调用回调。我们确实有一些奇怪的地方。不确定它是来自这个还是其他什么,但我想我会删除任何可能有问题的东西。 我不认为它是“错误的方向”..问题应该是别的..如果没有错误,callback 的第一个参数应该为空,否则.series call 只会退出并出现错误。尝试使用console.trace()、断点和更多输出对其进行调试。 我同意@Phoenix,我不认为这是你的问题。回调未包含在异步调用中的事实不应该有所作为。无论哪种方式,回调都将被称为同步操作。发生这种情况的刻度无关紧要。我会扔一些日志来看看到底发生了什么。或许看看sql操作中的回调是如何被调用的。 我应该明确指出没有一致的错误。我知道如何解决这些问题 :) 时不时地事情不正常。复制并不容易,而且发生在不同的地方。 【参考方案1】:

我终于找到了我记得不久前读过的参考资料。

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

他在第 3 条规则中讨论了一般情况,并且与我的问题更直接相关,以回应页面上的第一条评论。

即使这不是我随机错误的原因,我也想根据作者的意图使用该模块,这是问题的重点。

在这篇文章中,他提到了使用 process.nextTick,但我真的认为 node 在这种情况下正试图摆脱这种情况,我在一个月前的异步问题线程中发现了一个响应,上面写着:

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

所以,这就是我要回答的问题。我将在 setImmediate 中包装所有同步回调。

【讨论】:

以上是关于node.js async.js nextTick vs setImmediate的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - Async.js:并行执行如何工作?

调试 node.js 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止

如何使用async.js简化Node.js中的回调代码

Async.js解决Node.js操作MySQL的回调大坑

Node.js 中 process.nextTick 的正确用例是啥?

译Node.js 事件循环, 定时器, 和 process.nextTick()