javascript - async/await 会阻塞事件循环吗?

标签 javascript node.js asynchronous promise async-await

<分区>

我正在阅读 Don't Block the Event Loop来自 Node.js 指南。有一句话说:

You should make sure you never block the Event Loop. In other words, each of your JavaScript callbacks should complete quickly. This of course also applies to your await's, your Promise.then's, and so on.

我开始怀疑,如果我正在awaiting 的某些对数据库的 API 调用需要一些时间来解决,这是否意味着我已经用 await 调用?

之后,我开始测试一些自己编写的代码,但测试后我仍然不清楚通过 await 进行阻塞是如何工作的。下面是一些测试代码:

假设我正在使用 express 进行测试。我理解为什么在这种情况下对 /test 路由进行 2 个 API 调用会阻塞事件循环。

function someHeavyWork() {
  // like calling pbkdf2 function
}

app.get('/test', (req, res) => {
  someHeavyWork();
  res.json(data);
});

但在这种情况下不会发生这种情况。

function fakeDBCall() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(data);
    }, 5000)
  })
}

app.get('/test', async (req, res) => {
  const data = await fakeDbCall();
  res.json(data);
})

这可能是因为我对阻塞在 async/await 中的工作原理缺乏理解。

最佳答案

与看起来相反,await 不会阻塞。这只是 promise 的语法糖。什么都没有被阻止;它可能看起来阻塞以允许代码同步,但这只是 promise 的糖分。例如,这可能看起来是同步的:

const response = await fetch(…);
const json = await response.json();
const foo = JSON.parse(json); // Using json here, even though my request was async!

但事实并非如此。一旦你 desugar 它,你得到的只是 promise ,它是非阻塞的:

fetch(…)
  .then(response => response.json())
  .then(json => {
    const foo = JSON.parse(json);
  });

如果 await 被阻塞,那绝对是灾难性的。 JavaScript 运行时通常是单线程的。这意味着只要您发出请求或其他一些异步操作(例如使用文件系统),用户交互和其他进程就会停止。在相关说明中,这与动态导入一起是 main argument against top level await

关于javascript - async/await 会阻塞事件循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51583483/

相关文章:

node.js - Node && Mongodb findOne 不工作

javascript - 使用 application/x-www-form-urlencoded 使用 node.js 在发布请求中发送数组

swift - 如何在允许 JWT 刷新的同时检查 Swift 中的 Auth 用户?

javascript - 如何更改 SVG 文本的值?

随机十进制值后的 Javascript 舍入值

javascript - 无法根据从 2 个下拉列表中选择的值获取值

node.js - 如何将带有模板的 twilio twiML 转换为 node.js 代码

javascript - 在 JavaScript 中从数组异步调用函数

asynchronous - 为什么 Async.Sequential 不能按预期工作(但在 FSI 中工作)?

javascript - 即使按照正确的顺序,函数也没有定义?