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 脚本时,VSCode 在“async_hooks.js”上的不可见断点处停止