#express #async-await #es6-promise #express-router
Вопрос:
Я знаю, что Express позволяет выполнять асинхронные функции в маршрутах и в промежуточных программах, но правильно ли это? Я прочитал документацию, и в ней указано, что НИКАКИЕ МАРШРУТЫ ИЛИ АСИНХРОННЫЕ ПРОМЕЖУТОЧНЫЕ ПРОГРАММЫ НЕ ДОЛЖНЫ НАЗНАЧАТЬСЯ, сегодня, в настоящее время, поддерживает ли Express асинхронные функции? Блокирует ли это процесс выполнения? o В НАСТОЯЩЕЕ ВРЕМЯ асинхронные функции НЕ БЛОКИРУЮТ ПРОЦЕСС ВЫПОЛНЕНИЯ?,
Например, если я размещаю данные на асинхронном маршруте и если запросы выполняются на этом маршруте одновременно, разрешаются ли они параллельно?, то есть:
Или при назначении асинхронных маршрутов будут ли эти запросы разрешаться один за другим?, то есть:
Это то, что я подразумеваю под «блокировкой процесса выполнения», потому что, если один из них завершится неудачей, будут ли другие запросы ожидающими? или я неправильно понял?
Я надеюсь, что вы сможете мне помочь.
Ответ №1:
Вы можете прекрасно использовать async
функции в Express, но блокируются они или нет , не имеет никакого отношения к тому, являются ли они таковыми async
, но все зависит от того, что делает код в функции. Если он запустит асинхронную операцию, а затем вернется, то он не будет заблокирован. Но если он выполнит кучу синхронного кода, отнимающего много времени, прежде чем вернется, это заблокируется.
Если getDBInfo()
является асинхронным и возвращает обещание, которое разрешается по завершении, то в ваших примерах будут выполняться одновременно три операции с базой данных. Действительно ли они работают параллельно или нет, полностью зависит от реализации вашей базы данных, но код, который вы показываете здесь, позволяет им работать параллельно, если база данных реализует это.
Единственный поток выполнения Javascript выполнит первый вызов getDBInfo()
, этот запрос к БД будет запущен и немедленно вернет обещание. Затем он попадет в await
и приостановит выполнение содержащей функции. Это позволит циклу событий затем начать обработку второго запроса, и он сделает то же самое. Когда он попадет в await
, он приостановит выполнение содержащей функции и позволит циклу событий обработать третий запрос, который сделает то же самое. Затем, некоторое время спустя, завершится один из вызовов БД (это может быть любой из трех), который выполнит свое обещание, которое не вызовет подозрений у функции, и она отправит ответ. Затем один за другим два других вызова БД завершатся и отправят свои ответы.
Комментарии:
1. Я обновляю содержание вопроса изображениями и примерами, надеюсь, вы сможете мне помочь.
2. @Grizzly — К моему ответу добавлена дополнительная информация.
3. Аа! теперь я понимаю, но чтобы было яснее, когда вы говорите: «функция возвращает», вы имеете в виду, что что? отправить ответ ?, то есть, если я сделаю это:
app.get('/', await (req, res) => { res.json ({ msg: 'ok' }) });
, Функция «возвращает что-то» (возвращает ответ), вы это имеете в виду?, так как это не заблокировало бы процесс, верно?4. @Grizzly — Ну, в моем ответе нигде не говорится о том, что вы процитировали: «функция возвращает», поэтому я не совсем уверен, о чем вы спрашиваете. Это
app.get('/', await (req, res) => { ...});
было бы неправильно. Вы бы пытались использовать ссылку наawait
функцию, которая бесполезна.5. Извините, очевидно, я ошибаюсь, я плохо говорю по-английски, может быть, я ошибся в переводе, в любом случае спасибо.