递归函数和setTimeout与setInterval

时间:2015-09-01 16:05:33

标签: javascript settimeout setinterval jquery-deferred

请考虑以下事项:

$(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,或者它们都重复使用相同的变种?
  • 如果为每次迭代创建一个新的var,我是否可以超时(堆栈溢出!!! );)?应用程序正在显示数据并且应该运行很长时间
  • 我还有另一个setInterval((function refresh(){...}), 5 *1000)没有setTimeout的版本,哪一个更好?想法?

谢谢

3 个答案:

答案 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将在给定的时间后继续调用函数,而不管函数是否已完成执行