Мне кажется смешным, что вы должны делать это вручную, а не уничтожать сам объект в конце процесса
Это забавно, потому что вы, вероятно, подвергались более синхронному программированиюпо сравнению с асинхронным.Рассмотрим приведенный ниже код
fs = require('fs')
data = fs.readFileSync('file.txt', 'utf-8');
console.log("Read data", data)
Когда вы запустите выше, вы получите вывод
$ node sync.js
Read data Hello World
Это синхронный код.Теперь рассмотрим асинхронную версию того же
fs = require('fs')
data = fs.readFile('file.txt', 'utf-8', function(err, data) {
console.log("Got data back from file", data)
});
console.log("Read data", data);
При запуске вы получите следующий вывод
$ node async.js
Read data undefined
Got data back from file Hello World
Теперь, если вы считаете себя синхронным программистом, программа должна была завершиться впоследний console.log("Read data", data);
, но вы получите еще одно утверждение, напечатанное впоследствии.Теперь это смешно?Давайте добавим оператор выхода в процесс
fs = require('fs')
data = fs.readFile('file.txt', 'utf-8', function(err, data) {
console.log("Got data back from file", data)
});
console.log("Read data", data);
process.exit(0)
Теперь, когда вы запускаете программу, она заканчивается на последнем утверждении.
$ node async.js
Read data undefined
Но файл фактически не читается.Зачем?потому что вы никогда не давали движку JavaScript время для выполнения ожидающих обратных вызовов.В идеале процесс автоматически завершается, когда для него не осталось работы (нет ожидающих обратных вызовов, вызовов функций и т. Д.).Так работает асинхронный мир.Есть несколько хороших SO тем и статей, которые вы должны посмотреть в
https://medium.freecodecamp.org/walking-inside-nodejs-event-loop-85caeca391a9
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Как выйти в Node.js
Почему мой процесс Node.js не завершается после удаления всех слушателей?
Как процесс node.js узнает, когда остановиться?
Так что в асинхронном мире вам нужно либо сказать процессу завершиться, либо он автоматически завершится, когда нет ожидающих задач (которые вы знаете, как проверить - process._getActiveRequests()
и process._getActiveHandles()
)