<分区>
我正在阅读 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, yourPromise.then
's, and so on.
我开始怀疑,如果我正在await
ing 的某些对数据库的 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
中的工作原理缺乏理解。