使用caolan的异步库,何时应使用process.nextTick,何时应仅调用回调?

时间:2019-02-28 20:10:39

标签: node.js

我一直在仔细阅读它们之间的差异,在使用有助于异步方法的库时,很难想到它。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

在您的代码中,异步方法依次被依次调用。但是,在执行该代码时,由于您的代码可以控制,因此node.js仍然可以响应其他传入请求。

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

这实际上是怎么回事:

  1. 在后台启动异步操作(产量控制)

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

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

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

以此类推。 Process.nextTick()对节点说:“停止处理一段时间,一旦处理完其他正在等待的内容,请返回。” Node停止运行并处理所有内容,然后返回处理预定的请求。

在您的情况下,没有其他等待,因此节点仅从中断处继续。但是,如果还有其他事情像其他传入的HTTP请求一样进行,则情况并非如此。

随时提问。