Промежуточное программное обеспечение не выглядит само по себе асинхронным. Другими словами, как вы сказали в своем комментарии к другому ответу, не заставляет каждый слой в «стеке» промежуточного программного обеспечения / обработчиков expressjs в отдельный фрейм в очереди событий JavaScript.
Если вы отслеживаете функцию next()
в .use()
, есть пара setImmediate
довольно рано для обработки «выходного маршрутизатора» или «больше слоев», но затем вы попадаете в while
цикл на стеке обработчиков. Это происходит в районе этой точки в коде .
Так что, если все ваше промежуточное ПО было похоже на этот раздел, все промежуточное ПО и т. Д. Происходили бы в одном кадре в очереди событий:
app.use(function(req, res, next){
console.log('synchronous layer');
next();
});
В то время как следующий шаг поместит next
в отдельный кадр в очереди событий и потенциально позволит процессу обрабатывать другие кадры, которые могут быть поставлены в очередь.
app.use(function(req, res, next){
setImmediate(()=> {
console.log('setImmediate puts this next() into a separate frame in the event queue');
next();
});
});
Не могу себе представить, что это обычно будет проблемой. Большинство вещей, которые могут произойти в промежуточном программном обеспечении, что может занять некоторое время (вызов базы данных и т. Д.), Вполне вероятно, что все будет происходить асинхронно (таким образом, что next
помещается в новый кадр в очереди событий). Но об этом стоит подумать, когда вы добавляете промежуточное ПО ...