递归 setTimeout 模式

5
阅读长轮询文章时,我对setInterval的以下两种风格有些困惑:

1 -

setInterval(function(){
    $.ajax({ url: "server", success: function(data){
        //Update your dashboard gauge
        salesGauge.setValue(data.value);
    }, dataType: "json"});
}, 30000);

2-

(function poll() {
   setTimeout(function() {
       $.ajax({ url: "server", success: function(data) {
            sales.setValue(data.value);
       }, dataType: "json", complete: poll });
    }, 30000);
})();

根据博客所说-关于第二个片段,
因此,这种模式并不保证按固定间隔执行。但是,它确保了在调用下一个间隔之前已完成上一个间隔。
为什么第二个片段可以保证上一个间隔已经完成?
我知道第一个(事件循环),但对第二个片段有点困惑。

为什么第二个代码片段可以保证前一个时间间隔已经完成?它保证了之前的 AJAX 已经完成。 - Tushar
@Tushar 这实际上就是问题所在。为什么不能先保证相同呢? - Deepak Ingole
如果AJAX花费的时间超过了30000毫秒,会发生什么? - Tushar
在第二种方法中,setTimeout仅在第一次调用时被调用一次。它会在ajax的回调函数中再次被调用。因此,它保证了ajax调用在第二次执行开始之前已经完成。而在第一种方法中,无论ajax的结果如何,setInterval都会以固定的时间间隔不断地调用函数。它不关心回调是否作为先前执行的结果到达。希望这可以帮助您。 - Mahesh Chavda
1个回答

3

为什么第二个片段可以保证上一个时间间隔已经完成了?

在第一个示例中,$.ajax()会按照一定的时间间隔被调用,无论前一个$.ajax()调用是否已经完成。

在第二个示例中,只有在$.ajax()complete函数被触发后,poll才会再次被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接