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)の実装はここから取得されます。Memリークは、PubSubを実装する前にも発生したため、明らかに関連性はありません。
- 古いものが成功した後にのみ新しいAjax呼び出しを実行するために、 setIntervalの代わりにsetTimeoutが使用されます。
- もちろん、「state:refresh 」をリッスンし、 wp.state.dataのデータを使用する他の関数もあります。