Кросс-пост от Reddit .
Назначение асинхронных функций в JavaScript немного отличается от того, что вы ищете.
Помните, что JavaScript является однопоточным - он может делать только одно за раз. Вот некоторый традиционный код блокировки:
sys.puts("Before");
sleep(10);
sys.puts("After");
В реальном веб-приложении sleep()
может вместо этого быть длительным вызовом базы данных, сетевым запросом (например, ожидание данных из веб-браузера пользователя), вспомогательным инструментом или доступом к файлу.
Если вы используете блокировку вызовов, как описано выше, сервер Node.js не сможет делать что-либо еще (например, запускать другие веб-запросы) во время ожидания.
PHP и многие другие среды веб-программирования обрабатывают это, создавая абсолютно отдельные потоки для каждого запроса. Node.js использует функции обратного вызова. Вместо этого вы можете написать такой же код:
sys.puts("Before");
setTimeout(function(){
sys.puts("After");
}, 10000);
Здесь вы создаете функцию и передаете ее в setTimeout()
. Его код еще не запущен, но когда он это сделает, он получит доступ ко всем областям видимости (всем переменным), в которых он был создан. setTimeout()
получает ссылку на функцию и планирует запуск события цикл обработки событий после истечения времени ожидания.
Цикл событий - это, по сути, список дел программы Node.js (они являются общими - все приложения с графическим интерфейсом, работающие на вашем компьютере, вероятно, используют циклы событий!).
После вызова setTimeout()
текущая функция продолжает выполняться. В конце концов он возвращается, и функция, которая его вызывала, возвращается, и так далее, пока программа не вернется обратно в цикл обработки событий. Цикл обработки событий проверяет, произошло ли что-нибудь (например, входящий запрос) во время выполнения вашего кода, и вызывает соответствующую функцию в вашем коде. Если нет, он ждет, пока что-то произойдет (например, истекло время ожидания).
Асинхронный код не позволяет вашему коду делать много вещей одновременно, он делает устранение блокировки, когда какой-либо код зависит от чего-то внешнего для продолжения.
Редко когда вам нужно блокировать работу внутри вашей программы Node.js. Если вы это сделаете, вы должны разделить эту работу на отдельный процесс (который может быть даже другой программой Node.js) или написать аддон C / C ++ , который может свободно использовать потоки.