请考虑以下事项:
$(document).ready(function () {
var promise;
(function refresh(){
promise = loadInfo();
promise.done( function() {
$.each(loadedData, function(key, value){
$('#' + key + ' div.info').html(value.label);
})
// Call itself for next iteration
window.setTimeout(refresh, 5 *1000);
})
})()
})
promise
,或者它们都重复使用相同的变种?setInterval((function refresh(){...}), 5 *1000)
没有setTimeout的版本,哪一个更好?想法?谢谢
答案 0 :(得分:2)
由于promise变量是在刷新函数之上声明的,因此它可以通过闭包获得并将被重用,因此不会导致堆栈溢出,但loadInfo的实现将决定是否创建了一个新变量每一次与否。
这可能有助于阐明JavaScript和变量范围:How do JavaScript closures work?
也许稍微清理过的版本可能如下所示:
$(document).ready(function () {
(function refresh(){
loadInfo().done( function(loadedData) {
$.each(loadedData, function(key, value){
$('#' + key + ' div.info').html(value.label);
});
// Call itself for next iteration
window.setTimeout(refresh, 5 *1000);
});
})();
});
对某些人来说,使用setInterval可能更具可读性,但我认为你的setTimeout方法很好。
答案 1 :(得分:1)
setInterval确保定期请求(但不确保响应顺序),但setTimeout(您的代码)不能确保这一点。如果有长时间的响应,则等待时间也会延迟。另外,如果您的loadInfo()
请求失败,则需要更多代码才能进行下一次请求。
决定取决于您的服务器环境和应用程序的优先级。(在性能和准确性之间)
如果它有帮助,请参阅我的setTimeout代码。
$(document).ready(function () {
// for api
function repeatLoad( cb ) {
var bindedRepeatLoad = repeatLoad.bind( this, cb );
var repeat = setTimeout.bind( this, bindedRepeatLoad, 5*1000 );
loadInfo()
.done( cb )
.done( repeat )
.error( repeat );
}
// for view
function render( loadedData ) {
$.each(loadedData, function(key, value){
$('#' + key + ' div.info').html(value.label);
});
}
// for app logic, only 1 line is needed.
repeatLoad( render );
});
答案 2 :(得分:0)
setTimeout将等待函数完成,然后等待指定的时间,然后调用刷新函数。
setInterval将在给定的时间后继续调用函数,而不管函数是否已完成执行