首页 > 解决方案 > 使用 caolan 的异步库,什么时候应该使用 process.nextTick,什么时候应该只调用回调?

问题描述

我一直在阅读差异,在使用有助于异步方法的库时很难考虑它。

我正在使用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

解决方案


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

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

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

真正发生的是这样的:

  1. 在后台启动异步操作(屈服控制)

  2. 节点可用于处理其他东西

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

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

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

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

随意问的问题。


推荐阅读