Сложно ответить на ваш вопрос, так как вы не предоставляете подробную информацию о библиотеке / функциях, которые вы используете, например, откуда берется функция sendMail
, что такое app
и в какой момент выдумаю, что-то блокирует.
Однако, в общем случае, ваш код в Node.JS всегда выполняется в mainthread.Это означает, что каждая строка вашего файла .js находится в основном потоке, независимо от того, является ли что-то «асинхронным» или нет.
Теперь, чтобы фактически позволить чему-то быть "асинхронным" (то есть: выполняется , в то время как выполняется другой код), должен быть способ поместить материал в другой поток для выполнения.И это то, что на самом деле происходит в Node.JS под капотом.Node.JS использует libuv
/ libev
для реализации цикла событий для обработки задач.Он также имеет ряд фоновых / рабочих потоков (по умолчанию 4), которые выполняют задачи блокировки, например, сетевой или файловый ввод-вывод.
Однако, это абстракция от разработчика Node.JS, потому что она скрыта в реализации соответствующего модуля .Например, встроенная файловая система или сетевые модули будут выполнять свои задачи в фоновом потоке (если вы не используете один из вариантов функции -sync
).Если вы используете сторонний модуль, это зависит от того, написан ли он на C / C ++ и использует libuv
для доступа к рабочим потокам и выполнения фоновой обработки.Если это не так, то ваш сторонний модуль выполнит код в основной потоке так же, как и ваш код, если это так, то выполнение действительно выполняется «асинхронно» / в фоновом потоке.
Пожалуйста, посмотрите также это очень информативнонить: Как работает однопоточная неблокирующая модель ввода-вывода в Node.js
Как это вам поможет?
По сути, я хотел сказать, что этовсе зависит от функций / модулей, которые вы используете, и от того, реализованы ли они как фоновые операции (с использованием libuv
) или нет.Кроме того, вы не можете сделать что-либо асинхронным / синхронизировать самостоятельно, вы обязаны использовать все, что реализует функция / модуль.
Для полноты картины я хотел бы отметить, что Node.JS 11 представил worker_threads
модуль, который позволяет использовать потоки в коде javascript, что позволяет вам помещать что-то в фоновый поток, а не блокировать основную тему.Обратите внимание, что стабильность модуля все еще "экспериментальная".
Sidenote
Вы действительно уверены, что ваш код блокирует основную нить ?Поскольку, как упоминалось ранее, сетевой ввод-вывод в любом случае происходит в фоновых потоках, поэтому маловероятно, что sendMail
блокирует основную резьбу (при условии, что задача sendMail
заключается в выполнении сетевого ввода-вывода).Как вы узнали, что он блокирует?