Это использование setTimeout () скрывает утечку памяти? - PullRequest
0 голосов
/ 17 апреля 2020

Я с трудом пытаюсь обнаружить возможную утечку памяти в моем приложении 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);
        });
    }
}
...