Когда асинхронная функция возвращает значение, обещание разрешается, если функция содержит ошибку, обещание отклоняется только для чистоты, возвращая res.json (data), чтобы разрешить функцию.
от вопрос уже есть ответ здесь:
Будет асинхронно / ожидать блокировать поток node.js 5 ответовВ JavaScript блокирует ли использование `await` внутри цикла? 4 ответая читалНе блокируйте цикл событий из руководства Node.js. Была строка, говорящая:
Вы должны убедиться, что вы никогда не блокируете цикл событий. Другими словами, каждый из ваших обратных вызовов JavaScript должен завершаться быстро. Это, конечно, относится и к вашемуawait
х, твойPromise.then
и так далее.
Я начал задаваться вопросом, а что, если какой-то API вызовет базу данных, которую яawait
Это занимает некоторое время, означает ли это, что я заблокировал цикл обработки событий с этимawait
вызов?
После этого я начал тестировать некоторые самостоятельно написанные коды, но после тестирования мне все еще не ясно, как блокировать черезawait
работает. Вот некоторые тестовые коды:
Предполагая, что я использую экспресс для тестирования. Я понимаю, почему 2 вызова API для/test
В этом случае маршрут блокирует цикл обработки событий.
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
.