nodejs router.route содержит все промежуточное программное обеспечение asyn c, сам ли маршрутизатор asyn c?
Да, если задействована какая-либо промежуточная программа или обработчик при обработке входящего запроса он асинхронный, тогда результат будет доставлен асинхронно (на некотором будущем тике события l oop). «Асинхронный» часто называют «заразным» в том смысле, что если что-то в цепочке кода является асинхронным, то весь результат становится асинхронным, потому что, как только любая часть цепочки задерживается до будущего тика события l oop в любой части цепочки конечный результат всегда будет отложен до некоторого будущего тика события l oop.
Это похоже на поездку, в которой участвуют четыре разных поезда. Если один поезд сломается и вы застряли на 24 часа, то вы опоздаете на все последующие поезда в своем путешествии как минимум на 24 часа.
Существует разница между функцией промежуточного программного обеспечения, которая использует асинхронные операции и простая функция async
, которая специально не предназначена для использования в качестве функции промежуточного программного обеспечения.
Чтобы сделать что-то вроде:
router.route("/").get(something, something_else, one_more_thing)
Оба something
и something_else
имеют принять аргументы, такие как (req, res, next)
, и они должны вызвать next()
, когда они закончат, чтобы перейти к следующему обработчику в списке для этого маршрута. Они могут быть либо синхронными, либо асинхронными, если они либо вызывают next()
, когда они завершают переход к следующему промежуточному программному обеспечению, либо отправляют ответ и останавливают дальнейшую маршрутизацию, не вызывая next()
.
Это требует совершенно другая функция, чем выполнение таких вещей, как:
router.get('/', async (req, res) => {
try {
await something
await something_else
results = await one_more_thing
res.json(results)
} catch (err) {
res.send(err);
}
});
Если something()
и something_else()
возвращают обещания, как это подразумевается, то вы не можете использовать эти функции в первой форме - вы сможете использовать только им это нравится.
Так вот почему мне сильно не нравятся эти теоретические вопросы без псевдокода и без реального кода (они менее продуктивны для всех). Если вы покажете нам ФАКТИЧЕСКИЙ код для something()
и something_else()
, то мы сможем точно увидеть, как они написаны, и посоветовать вам, как исправить их для работы в одной из этих форм, или посоветовать, с какой именно формой они работают. .