每隔x秒执行setTimeout和Ajax时内存泄漏

时间:2012-04-22 08:17:34

标签: javascript jquery

我使用jQuery Ajax和setTimeout()每隔x秒获取一次新数据,这会导致内存泄漏。浏览器内存在每次Ajax调用时都会上升,直到浏览器崩溃。

$(document).ready(wp.state.init);

wp.state = {

    data: {},

    init: function () {
        $.PubSub('state:refresh').subscribe(function () {
            window.setTimeout(function () {
                wp.state.refresh();
            }, 1000);
        });

        this.refresh();
    },

    refresh: function () {

        $.ajax({
            url: 'http://url_here/',
            cache: false,
            dataType: "json",
            success: function (data) {
                wp.state.data = data;
                $.PubSub('state:refresh').publish();
            }
        });
    }
}

更新(基于@dez答案)

wp.state = {

    data: {},

    init: function () {
        $.PubSub('state:refresh').subscribe(function () {
            window.setTimeout(wp.state.refresh, 1000);
        });

        this.getState();
    },

    refresh: function () {
        wp.state.getState();
    },

    onSuccess: function (data) {
        wp.state.data = data;
        $.PubSub('state:refresh').publish();
    },

    getState: function () {

        $.ajax({
            url: 'http://url_here/',
            cache: false,
            dataType: "json",
            success: this.onSuccess
        });
    }
}

注意:

  • 发布者/订阅者( $。PubSub )实施从here开始。在实施PubSub之前也发生了Mem泄漏,因此它显然没有相关性。
  • setTimeout 用于代替 setInterval ,只有在旧的Ajax调用成功后才能执行新的Ajax调用。
  • 当然还有其他功能可以收听“状态:刷新”并使用 wp.state.data
  • 中的数据

1 个答案:

答案 0 :(得分:1)

我可以在这里看到一些问题,其中一些可能会导致你的内存泄漏。

首先,第一行:

$(document).ready(wp.state.init);

这不会在正确的范围内执行init,因此this的值将在行上未定义:

this.refresh();

你应该做这样的事情:

$(document).ready(function(){wp.state.init();});

或修改您的this.refresh()以明确wp.state.refresh()

我认为可能导致泄漏的是......

每次在$.ajax中进行refresh调用时,您都会创建一个新函数来处理成功回调。您应该将回调定义为wp.state对象上的另一个函数,并将其作为success传递,其方式与您当前将wp.state.init传递给ready()方法的方式相同。 / p>

同样,每次在订阅PubSub的函数中调用window.setTimeout时,您都会创建一个函数来处理该回调。你应该在这里做同样的事情并将其提取到wp.state上的函数中。