Перекресток с 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()
получает ссылку на функцию и расписывает событие, которое должно срабатывать по the event loop после истечения таймаута.
Цикл событий, по сути, представляет собой список дел программы Node.js (они распространены - все приложения GUI, запущенные на вашем компьютере, возможно, используют циклы событий!).
После вызова setTimeout()
текущая функция продолжает выполняться. В итоге он возвращается, и функция, которая вызвала его, возвращается и так далее, пока программа не вернется в цикл событий. Цикл событий смотрит, произошло ли что-либо (например, входящий запрос) во время выполнения вашего кода и вызывает соответствующую функцию в вашем коде. Если нет, он ждет, пока что-то произойдет (как истечение срока ожидания).
Асинхронный код не пусть ваш код сделать много вещей, в то же время, он делает устранить блокирование, когда какой-то код, зависит от чего-то внешнего, чтобы продолжить.
Редко вам нужно делать блокирующие работы внутри вашей программы Node.js. Если вы это сделаете, вы должны разделить эту работу на отдельный процесс (который может даже быть другой программой Node.js) или написать a C/C++ addon, который может свободно использовать потоки.
Есть ли у вас какие-либо идеи, как я могу достичь этого в node.js? Спасибо – Richard
Этот вопрос довольно старый, но все же очень интересный для новичков node.js, таких как я .. Как упоминалось, node.js предназначен для параллельного ввода-вывода, не параллельного работе. Это означает: если у вас есть трудоемкое задание для ответа на один запрос, узел node.js не ускорит то, что вы пытаетесь достичь в этом единственном запросе. Разница между использованием sleep() и setTimeout() ist заключается в том, что node.js блокирует все остальные запросы при использовании sleep() для времени сна - использование setTimeout() не блокирует другие запросы. Или: 10 запросов на спящий режим (10 секунд) будут принимать 100 с - 10 запросов на setTimeout (10 с) всего 10 секунд. – schlicki