【发布时间】:2020-03-26 11:36:23
【问题描述】:
例如,require 是同步的。
如果我将 require 放入异步函数并调用该异步函数,它会阻塞 nodejs 吗?
【问题讨论】:
-
异步是合作多任务处理;如果你不能等待它(或传递一个回调),它就会阻塞。
标签: node.js asynchronous promise async-await require
例如,require 是同步的。
如果我将 require 放入异步函数并调用该异步函数,它会阻塞 nodejs 吗?
【问题讨论】:
标签: node.js asynchronous promise async-await require
如果我将 require 放入异步函数并调用该异步函数,它会阻塞 nodejs 吗?
是的,确实如此。如果您使用require() 加载的模块尚未缓存,那么它将阻止解释器使用同步文件I/O 从磁盘加载模块。它在async 函数中的事实在这方面不会影响任何事情。
async 函数不会以任何方式更改阻塞、同步操作。它们提供自动异常处理并允许使用await 并始终返回一个承诺。它们没有影响函数内同步操作的魔力。
仅供参考,在几乎所有情况下,代码中需要的模块都应该在模块初始化时加载。然后可以稍后从其他代码中引用它们,而不会阻止解释器加载它们。
【讨论】:
import 也是同步的并且会阻塞。 node.js 中的import 和require() 主要是为启动代码而设计的,如果它是异步的,它会非常非常非常复杂。
它仍然会阻塞。对于您将包装在async 函数中的任何阻塞代码都是如此。还要意识到使用async 函数是没有用的,除非你也在其中使用await。
例如,您可以将async 函数编写如下:
async function work() {
await null;
synchronous_task();
}
work();
console.log("called work");
这里对work 的调用将立即返回,因为await,但是一旦该调用之后的代码完成(直到调用堆栈为空),将继续执行@ 之后的代码987654328@,并且在同步代码完成执行之前仍然会阻塞。
【讨论】: