Я с трудом пытаюсь обнаружить возможную утечку памяти в моем приложении JS. Он довольно большой, но я полагаю, что эта часть может быть ответственной (память постоянно растет, пока эта часть зацикливается).
Правильно ли это использование повторяющихся функций, анонимных функций и обещаний? Код прокомментирован.
// this is a global object that is called by other JS files (in this case: StateWatcher.startWatchSystem() )
var StateWatcher = {
systemWatchTimeout: undefined, // holds the return value of setTimeout()
startWatchSystem: function() {
if (this.systemWatchTimeout) return; // already started? exit.
this.doSystemStateUpdate(); // very first call, definition is at the end of this sample
// the next calls will be repated
var loop = () => {
var time; // timeout may change depending on the state of another object property (Gui.isWindowVisible)
if (Gui.isWindowVisible) time = Configuration.settings.systemWatchInterval;
else time = Configuration.settings.systemWatchIntervalMinimized;
if (time <= 0) return;
// start the timeout
this.systemWatchTimeout = setTimeout(() => {
this.doSystemStateUpdate() // this is an async remote call, it will end after X seconds
.finally(() => { loop(); }); // when finished, repeat it
}, time);
};
loop(); // start!
},
//** doSystemStateUpdate: **/
doSystemStateUpdate: function() {
return RemoteQuery.getSystemState() // this is the actual async function, it uses ajax and returns a Promise
.then((data) => {
// when this call finishes, other components in the app must be informed (using events emitter)
Globals.MESSAGE_EMITTER.emit('systemStateUpdated', data.Message);
})
.catch((error) => {
Logger.write("error", "doSystemStateUpdate Failed:");
Logger.write("error", error);
});
}
}