我有一个第三方JavaScript对象,我在其上调用方法“搜索”并传入搜索查询字符串以及搜索完成后要执行的函数。然后,此第三方对象消失,并尝试从服务中检索数据。如果服务调用未能在10秒内返回,则第三方对象会记录超时错误,但遗憾的是不会执行状态为“超时”或其他适用的回调函数。
为了在超时时执行回调,我按照以下代码包装了第三方对象调用:
var SEARCH_TIMEOUT_MILLISECONDS = 10500;
var thirdPartyObject = ... // Global variable
function search(searchTerm, onCompleteCallback) {
var searchTimeoutHandler = setTimeout(function () {
onCompleteCallback(null, 'TIMEOUT');
}, SEARCH_TIMEOUT_MILLISECONDS);
thirdPartyObject.search({
searchTerm: searchTerm,
onComplete: function (searchResponse, status) {
clearTimeout(searchTimeoutHandler);
onCompleteCallback(searchResponse, status);
}
});
}
如果正在创建一个闭包,如果这个函数被调用了数百次(某些同时发生),那么在调用setTimeout函数的场景中会不会有任何内存问题?
答案 0 :(得分:0)
不,不应该有任何内存泄漏。就超时而言,只有两种情况:
但是,如果您有多次搜索已经完成了数百次,那么这些超时处理程序可能会堆积,但最终会被清除(最多只能获取n * SEARCH_TIMEOUT_MILLISECONDS
,其中n
是已调用时间search
,这也是您将拥有的超时处理程序的实例数)。所以本身没有内存泄漏,但你可以把事情堆积起来。您可能需要调整SEARCH_TIMEOUT_MILLISECONDS
变量,以便不会堆叠。您还可以查看Chrome开发者工具中的内存使用情况,了解正在耗尽的内存量。