【问题标题】:node.js async.js nextTick vs setImmediatenode.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操作中的回调是如何被调用的。
  • 我应该明确指出没有一致的错误。我知道如何解决这些问题 :) 时不时地事情不正常。复制并不容易,而且发生在不同的地方。

标签: node.js asynchronous async.js


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2015-02-23
    • 2013-07-04
    • 2021-10-26
    • 2020-10-06
    • 2014-07-29
    • 2016-02-18
    相关资源
    最近更新 更多