我使用 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
});
}
}
笔记:
- Publisher/Subscriber ( $.PubSub ) 实现采用此处的形式。在实施 PubSub 之前也发生了 Mem 泄漏,因此它显然不相关。
- 使用setTimeout代替setInterval以便仅在旧的 Ajax 调用成功后执行新的 Ajax 调用。
- 当然还有其他函数可以监听' state:refresh '并使用wp.state.data中的数据