我使用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
});
}
}
注意:
答案 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
上的函数中。