【发布时间】:2013-07-25 19:06:53
【问题描述】:
我有一个第三方 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 函数被调用或不被调用的场景中是否会出现内存问题?
【问题讨论】:
-
这里最糟糕的是timeout函数似乎并没有中止搜索,所以如果搜索在10.5秒后返回,那么
onCompleteCallback(searchResponse, status)将被执行,尽管onCompleteCallback(null, 'TIMEOUT')已经被执行了。跨度>
标签: javascript callback timeout closures settimeout