node.js - 使用 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);
谢谢!
解决方案
代码以 SEQUENTIAL 方式发生,而不是同步方式。这是一个重要的区别。
在您的代码中,异步方法按顺序依次调用。但是,当该代码正在执行时,node.js 仍然可以响应其他传入请求,因为您的代码会产生控制权。
节点是单线程的。因此,如果您的代码正在同步执行某些操作,则节点在该代码完成之前无法接受新请求或执行操作。例如,如果您执行了同步 Web 请求,节点将停止执行任何其他操作,直到该请求完成。
真正发生的是这样的:
在后台启动异步操作(屈服控制)
节点可用于处理其他东西
异步操作 1 完成。节点启动异步操作 2 并产生控制权。
- 节点可以接受其他请求/处理其他东西。
- 异步操作 2 完成...
等等。Process.nextTick() 对节点说“暂时停止处理这个问题,等你处理完其他等待你的东西后再回来”。Node 关闭并处理任何内容,然后返回处理您的预定请求。
在你的情况下,没有其他等待,所以节点只是从它离开的地方继续。但是,如果还有其他事情发生,例如其他传入的 HTTP 请求,情况就不会如此。
随意问的问题。
推荐阅读
- kotlin - 使用 RxJava 的多个 POST 请求
- html - 为什么图像显示在服务器上而不显示在本地主机上?
- python - 诱使 PyCharm 在可调用对象中推断通用 Python 类型参数的技巧?
- c++ - 可加载的 macOS 捆绑符号与动态库中的符号冲突
- html - 页脚代码在 CSS 样式表中显示为红色,但 HTML 代码很好
- google-classroom - 为 API Google Classroom 求批量级补丁
- c# - 有没有办法使用 Confluent.Kafka .Net 客户端查询主题的复制因子和保留时间?
- amazon-web-services - 使用无服务器框架为 SQS 创建 s3 事件
- javascript - 使用按钮扩展截断文本和使用处理程序的跨度的区别
- python - Pygame 从 .txt 文件中读取字符串,然后用作颜色错误