Javascript 如何处理多个超时造成的延迟(包含ajax调用)

Javascript 如何处理多个超时造成的延迟(包含ajax调用),javascript,jquery,asp.net,ajax,performance,Javascript,Jquery,Asp.net,Ajax,Performance,假设我有多个(有时超过12个)ajax调用,每2秒或更长时间调用一次。通过调用收集的数据被设置为包含UI的元素(如进度条)。毕竟,当定时器工作时,我会延迟滚动。这种延误是自然的,但我该如何处理呢 注意:呼叫目的地是以最短时间提供数据的服务。使滚动变得悲伤的一点是使用多个setTimeout()和setInterval()方法。要更熟悉我的工作,请参阅以下代码: function FillData(accessUrl, name) { var add = accessUrl

假设我有多个(有时超过12个)ajax调用,每2秒或更长时间调用一次。通过调用收集的数据被设置为包含UI的元素(如进度条)。毕竟,当定时器工作时,我会延迟滚动。这种延误是自然的,但我该如何处理呢

注意:呼叫目的地是以最短时间提供数据的服务。使滚动变得悲伤的一点是使用多个
setTimeout()
setInterval()
方法。要更熟悉我的工作,请参阅以下代码:

function FillData(accessUrl, name) {
            var add = accessUrl;
            $.support.cors = true;
            if (add) {
                $.ajax({
                    type: 'GET',
                    url: accessUrl,
                    crossDomain: true,
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function (data) {
                        Update(name, data);
                    },
                    error: function (xhr, status, error) {
                        LogResponseErrors(status , error, name);
                    }
                });
                setTimeout(function () { FillData(accessUrl, name); }, interval);
                //Consider that the method calls with different parameters one time and it will run automatically with setTimeout
            }
            else {
                freezeFrame(name);
            }
    }
Used标签解释了我使用的内容


根据我对你问题的理解,任何有用的答案都将不胜感激。处理ajax响应时会有延迟,需要消除延迟

Javascript是单线程的。因此,如果有一个函数需要很长时间才能完成,它可能会控制线程并导致UI不响应。要解决此问题,您有两种选择:

  • 优化代码,使函数不会花费很长时间
  • 使用
    setTimeout
    将函数分解为更小的部分。例如:如果您的函数正在执行一个包含100个项的循环,那么您可以将其中断以执行10次,每次执行10个项
更新:(基于更新的问题):

这样使用
setTimeout
时,循环似乎从未停止过。应该有如下内容:

counter++;
if (counter <= 12)
setTimeout(function () { FillData(accessUrl, name); }, interval);
counter++;

如果(谢谢你的回答。考虑到你的回答,我会更新我的问题。当然,循环是为了持续监控数据而创建的,不会停止。@A.Mokhtari:好的,但你不应该这样做。由于时间原因,这可能会导致事件在某个时候升级,并导致严重的性能问题。好吧,我的朋友,那么我的选项是?@A.Mokhtari:如果只想在调用成功时重新加载数据,请将
setTimeout
放在
success
内;如果需要始终重新加载数据,请将
setTimeout
放在
complete
内(不关心当前ajax是否成功)。在我看来,我们应该把它放在
complete
中。为什么不把setTimeout放在$.ajax complete函数中呢?由于ajax和setTimeout之间的计时问题,在某些情况下,队列中有很多事件等待执行,并导致性能问题。@khato您是指“成功”函数还是其他函数她的函数名为“Complete”?还有另一个函数名为“Complete”,无论调用成功与否,它都会执行。选择取决于您需要什么。我非常相信这是一个问题。您需要检查的另一个可能的问题是,
更新
是否需要很长时间才能完成。