Задать вопрос
@Boris007

Происходит ли блокировка при обращении к асинхронным роутам?

Подскажите, по какому принципу работает цикл событий при выполнении роутов?
Предположим, что нам ответ из БД придет через 2 секунды.
Если в течении этого времени будут еще запросы, у нас будут просто добавляться в цикл событий новые колбеки в виде router.get или они будут ожидать окончания одного общего роута?
router.get('/', async function(req: Request, res: Response) {
	const pool = new Pool(config)
	const res = await pool.query('SELECT * from users')
	res.send(res.rows)
});
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
bingo347
@bingo347 Куратор тега Node.js
Crazy on performance...
async function выполняется синхронно до первого await
Каждый встреченный по ходу выполнения await прерывает функцию, выкидывая из нее вверх по стектрейсу, в случае если это первый await, то продолжит исполняться функция, вызвавшая нашу, но там обычно тоже await, хотя и не обязательно. Так постепенно мы вывалимся в event-loop. Продолжение работы после await вызывается непосредственно из event-loop, так что в этом случае выше по стектрейсу будет только он.
Когда исполнение в event-loop, он просто берет следующую задачу из очереди. Притом async function - это абстракция над промисами и их колбэками, а они выполняются в очереди микротасок, которую event-loop разбирает пока она не станет пустой.

Если ближе к примеру в вопросе, то выполнение будет таким:
1. event-loop вызовет колбэк http сервера, который часть роутера
2. роутер вызовет наш колбэк, он это может делать как синхронно так и асинхронно (express делает синхронно)
3. Наш колбэк отправит запрос в БД, получит его промис и остановится на await
4. мы вернем управление роутеру, а он модулю http и в итоге все вернется в event-loop
5. event-loop возьмет следующую таску из очереди, это может быть как запрос к http серверу, так и ответ от БД
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы