【问题标题】:Using caolan's async library, when should I use process.nextTick and when should I just invoke the callback?使用 caolan 的异步库,什么时候应该使用 process.nextTick,什么时候应该调用回调?
【发布时间】:2019-03-01 04:25:51
【问题描述】:

我一直在阅读不同之处,但在使用有助于异步方法的库时很难考虑。

我正在使用https://github.com/caolan/async 编写特定的异步调用。我很难理解在其中一些异步方法中使用process.nextTick,尤其是异步系列方法,其中异步方法基本上是同步执行的。

例如:

async.waterfall([
    next => someAsyncMethod(next),
    (res, next) => {
        if (res === someCondition) {
            return anotherAsyncMethod(next);
        }
        return process.nextTick(next); // vs just calling next()
    },
], cb);

我以前在代码中看到过这种情况。但我不知道为什么?只是调用 next 而不是 process.nextTick 会给我同样的结果吗?

在这些场景中使用process.nextTick 是否有任何理由,其中存在以同步方式控制的异步方法?

另外,像下面这样的异步呢?

async.map(someArray, (item, next) => {
    if (item === someCondition) {
        return anotherAsyncMethod(next);
    }
    return process.nextTick(next); // vs just calling next()
}, cb);

谢谢!

【问题讨论】:

    标签: node.js


    【解决方案1】:

    代码以 SEQUENTIAL 方式发生,而不是同步方式。这是一个重要的区别。

    在您的代码中,异步方法按顺序依次调用。但是,当该代码正在执行时,node.js 仍然可以响应其他传入请求,因为您的代码会产生控制权。

    节点是单线程的。因此,如果您的代码正在同步执行某些操作,则在该代码完成之前,节点无法接受新请求或执行操作。例如,如果您执行了同步 Web 请求,节点将停止执行任何其他操作,直到该请求完成。

    真正发生的事情是这样的:

    1. 在后台启动异步操作(yield control)

    2. 节点可用于处理其他内容

    3. 异步操作 1 完成。节点启动异步操作 2 并产生控制权。

    4. 节点可以接受其他请求/处理其他内容。
    5. 异步操作 2 完成...

    等等。 Process.nextTick() 对节点说“暂时停止处理这个问题,等你处理完其他等待你的东西后再回来”。 Node 关闭并处理所有内容,然后返回处理您的预定请求。

    在你的情况下,没有其他等待,所以节点只是从它离开的地方继续。但是,如果还有其他事情发生,比如其他传入的 HTTP 请求,情况就不是这样了。

    欢迎提问。

    【讨论】:

    • 对于像async.waterfallasync.series这样的调用,它们依赖于之前的回调来完成,然后再继续下一步。那么这不是同步的吗?在使用瀑布的情况下,它依赖于先前的响应,并且只有在异步方法完成并且能够传递到下一个异步方法时。那么在这种情况下,process.nextTick会有什么用例吗?
    • 跟进process.nextTick,特别是对于同时发出许多异步请求的async.map 用法。据我所知,async.map 有一个最终回调,它会在传递给它的列表中的所有内容(即someArray)完成后触发。那么,在条件异步方法中是否会有process.nextTick 的用例?我不知道在这些情况下仅调用回调与使用 process.nextTick 之间是否有任何区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-04-15
    • 2017-04-10
    • 2012-03-19
    • 2018-05-12
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多