Я заметил, что некоторые люди здесь рекомендуют использовать await / async и обещание вместо setTimeout напрямую, если вы хотите отложить выполнение чего-либо.Это код:
async wait (ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
Так что я бы использовал
await wait(3000);
my_function();
вместо
setTimeout(() => {
my_function();
}, 3000);
Это имеет смысл, но я заметил, что если я это сделаю, яувеличение использования памяти, и в конечном итоге приложение вылетает с кучей нехватки памяти через несколько часов.
Это проблема в многообещающем дизайне nodejs или я что-то здесь упускаю?
Этот код воспроизводит проблему:
const heapdump = require('heapdump'),
fs = require('fs');
class test {
constructor(){
this.repeatFunc();
}
async wait (ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
async repeatFunc(){
// do some work...
heapdump.writeSnapshot(__dirname + '/' + Date.now() + '.heapsnapshot');
await this.wait(5000);
await this.repeatFunc();
}
}
new test();
Уведомление о дампе кучи продолжает увеличиваться каждые 5 секунд
При использовании setInterval этого не происходит:
const heapdump = require('heapdump'),
fs = require('fs');
class test {
constructor() {
setInterval(this.repeatFunc, 5000);
}
repeatFunc() {
// do some work...
heapdump.writeSnapshot(__dirname + '/' + Date.now() + '.heapsnapshot');
}
}
new test();