我一直在仔细阅读它们之间的差异,在使用有助于异步方法的库时,很难想到它。
我正在使用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);
谢谢!
答案 0 :(得分:1)
代码以序列方式而不是同步方式发生。这是一个重要的区别。
在您的代码中,异步方法依次被依次调用。但是,在执行该代码时,由于您的代码可以控制,因此node.js仍然可以响应其他传入请求。
节点是单线程的。因此,如果您的代码正在同步执行某项操作,则在该代码完成之前,节点无法接受新请求或执行操作。例如,如果您执行了一个同步Web请求,则该节点将停止执行任何其他操作,直到该请求完成为止。
这实际上是怎么回事:
在后台启动异步操作(产量控制)
节点可用于处理其他内容
异步操作1完成。节点启动异步操作2并产生控制权。
以此类推。 Process.nextTick()对节点说:“停止处理一段时间,一旦处理完其他正在等待的内容,请返回。” Node停止运行并处理所有内容,然后返回处理预定的请求。
在您的情况下,没有其他等待,因此节点仅从中断处继续。但是,如果还有其他事情像其他传入的HTTP请求一样进行,则情况并非如此。
随时提问。