Узел
отслеживает все невыполненные рабочие запросы. Ваш вызов fs.writefile () создает рабочий запрос для ввода-вывода и добавляет ваш обратный вызов к этому запросу. узел сохраняет рабочий запрос в свои таблицы в то же время, когда он запускает операцию ввода-вывода. Выполнение вашего кода завершается, когда вы достигаете конца своей функции. (Но ваша память / переменные / и т.д. остаются)
Позже ввод-вывод завершается, и узел забирает рабочий запрос из своих таблиц. Он видит обратный вызов, прикрепленный к запросу, и вызывает эту функцию с результатами запроса ввода-вывода. Ваши глобальные данные все еще существуют и все переменные в замыканиях по-прежнему существуют, поэтому вашему коду кажется, что он никогда не останавливался.
Если вы больше ничего не делаете, больше не делаете запросов, тогда, когда вы вернетесь из своего узла функций, остановится, потому что тогда в очередях не останется никаких запросов.
Таким образом, узел «знает», как продолжать работу, потому что он отслеживает активные рабочие запросы в своих таблицах и не остановится, пока вся работа в очереди не будет выполнена и эти таблицы не пусты.
Обратите внимание, что «работа в очереди» может включать такие вещи, как ожидание таймеров или ожидание поступления сетевых данных. Вы делаете запрос, который говорит: «Позвоните мне здесь, когда / если что-то случится позже».
setTimeout () также является рабочим запросом (если вы немного щуритесь). С таймером вы знаете, что что-то случится и когда это произойдет. С setTimeout () произойдет только одно «что-то». узел сделает только один звонок на ваш обратный вызов, а затем «забудет» рабочий запрос. Если вместо этого вы используете setInterval (), вы создали постоянный рабочий запрос. узел будет «хранить» рабочий запрос в своих таблицах и будет неоднократно вызывать ваш обратный вызов, пока вы не отмените запрос.
net.Server.listen () - это еще один рабочий запрос, который является постоянным рабочим запросом. Вы не знаете, когда будет вызван ваш обратный вызов или сколько раз, потому что это зависит от подключения удаленных клиентов к вашему серверу. узел сохраняет рабочий запрос в своих таблицах, пока вы не отмените запрос.