Подтвердить что ты не робот

Как процесс node.js знает, когда остановиться?

Так как многие скрипты node.js следуют примеру асинхронного выполнения (пример ниже), как они знают, когда остановиться?

В следующем коде, как node определяет после обработки writeFile и соответствующим образом регистрирует обратный вызов, что процесс должен поддерживаться до тех пор, пока не будут выполнены обратные вызовы?

fs = require('fs');

fs.writeFile('foo', 'cat', function() {
  console.log('wrote to foo!'); 
  fs.readFile('foo', 'utf8', function(err, data) {
    console.log(data);
  });
}); 
4b9b3361

Ответ 1

node отслеживает все выдающиеся рабочие запросы. Ваш вызов fs.writefile() создает рабочий запрос для ввода-вывода и добавляет ваш обратный вызов к этому запросу. node сохраняет рабочий запрос в свои таблицы, одновременно запуская операцию ввода-вывода. Выполнение вашего кода завершается, когда вы достигнете конца вашей функции. (Но ваша память/переменные/и т.д. Остаются)

По завершении ввода/вывода и node выполняется рабочий запрос из его таблиц. Он видит обратный вызов, присоединенный к запросу, и поэтому вызывает эту функцию с результатами запроса ввода-вывода. Ваши глобальные данные все еще существуют, и все переменные в закрытии все еще существуют, поэтому кажется, что ваш код никогда не останавливался.

Если вы ничего больше не делаете, не делайте больше запросов, тогда, когда вы вернетесь из своих функций, node остановится, потому что в очередях не останется никаких оставшихся запросов.

Итак, node "знает", чтобы продолжать работать, потому что он отслеживает активные рабочие запросы в своих таблицах и не останавливается, пока не будет выполнена вся работа в очереди и эти таблицы пустые.

Обратите внимание, что "работа в очереди" может включать такие вещи, как ожидание таймеров или ожидание появления сетевых данных. Вы делаете запрос, в котором говорится: "Назовите меня здесь, когда/если что-то случится позже".

setTimeout() также является запросом на работу (если вы немного прищурились). С помощью таймера вы знаете, что что-то произойдет, и когда это произойдет. С setTimeout() произойдет только одно "что-то". node сделает только один вызов вашего обратного вызова и затем "забудет" запрос на работу. Если вместо этого вы используете setInterval(), вы создали постоянный рабочий запрос. node будет "хранить" рабочий запрос в своих таблицах и будет вызывать ваш обратный вызов несколько раз, пока вы не отмените запрос.

net.Server.listen() - это еще один запрос на работу, который является постоянным рабочим запросом. Вы не знаете, когда будет вызван ваш callback или сколько раз, потому что это зависит от подключения удаленных клиентов к вашему серверу. node сохраняет рабочий запрос в своих таблицах до тех пор, пока вы не отмените запрос.