JQuery ajax 成功回调从未被垃圾收集
JQuery ajax success callback never garbage collected
请原谅我看起来很滑稽的 JS。它编译的咖啡脚本。
当我的 WebApp 上发生一些特定的事情时,我 运行 下面的回调函数开始一个 JSON get 请求:
GmScreen.prototype.requestPcUpdate = function(id) {
var currentUrl, self, url;
currentUrl = window.location.href;
url = currentUrl.substr(0, currentUrl.lastIndexOf('/')) + '.json';
self = this;
return $.ajax({
url: "/chars/" + id + ".json",
type: "GET",
error: function() {
return self.onPcUpdateError(this);
},
success: function(pc) {
return self.onPcUpdateReceived(pc);
}
});
};
成功回调函数如下:
GmScreen.prototype.onPcUpdateReceived = function(receivedPc) {
var pcObj;
if (!(receivedPc['id'] in this.allPcs)) {
console.error("No PC with ID " + receivedPc['id'] + " known!");
}
pcObj = this.allPcs[receivedPc['id']];
pcObj['cmlNode'] = new CmlCharacter((new DOMParser()).parseFromString(receivedPc['cml'], 'text/xml').documentElement);
return this.notifyPcChangeListeners();
};
在回调函数中,我创建了一个 XML 文档(以及一个基于它的包装器对象)并分配给它。当相同 ID 的下一个更新到达时,文档和包装对象可以被垃圾收集。
但这从未发生过。
在 Firefox 中,我看到阻止它被垃圾收集的 Dominator 叫做 mPromiseObj
。
随着时间的推移,这极大地影响了我的网络应用程序的性能。我怎样才能删除这个东西?
事实证明,我搞砸了我的回调。由于 notifyPcChangeListeners
,创建了一个最终会调用 onPcUpdateReceived
的新监听器。
所以阻止垃圾回收清理这个是完全正确的。
请原谅我看起来很滑稽的 JS。它编译的咖啡脚本。
当我的 WebApp 上发生一些特定的事情时,我 运行 下面的回调函数开始一个 JSON get 请求:
GmScreen.prototype.requestPcUpdate = function(id) {
var currentUrl, self, url;
currentUrl = window.location.href;
url = currentUrl.substr(0, currentUrl.lastIndexOf('/')) + '.json';
self = this;
return $.ajax({
url: "/chars/" + id + ".json",
type: "GET",
error: function() {
return self.onPcUpdateError(this);
},
success: function(pc) {
return self.onPcUpdateReceived(pc);
}
});
};
成功回调函数如下:
GmScreen.prototype.onPcUpdateReceived = function(receivedPc) {
var pcObj;
if (!(receivedPc['id'] in this.allPcs)) {
console.error("No PC with ID " + receivedPc['id'] + " known!");
}
pcObj = this.allPcs[receivedPc['id']];
pcObj['cmlNode'] = new CmlCharacter((new DOMParser()).parseFromString(receivedPc['cml'], 'text/xml').documentElement);
return this.notifyPcChangeListeners();
};
在回调函数中,我创建了一个 XML 文档(以及一个基于它的包装器对象)并分配给它。当相同 ID 的下一个更新到达时,文档和包装对象可以被垃圾收集。
但这从未发生过。
在 Firefox 中,我看到阻止它被垃圾收集的 Dominator 叫做 mPromiseObj
。
随着时间的推移,这极大地影响了我的网络应用程序的性能。我怎样才能删除这个东西?
事实证明,我搞砸了我的回调。由于 notifyPcChangeListeners
,创建了一个最终会调用 onPcUpdateReceived
的新监听器。
所以阻止垃圾回收清理这个是完全正确的。