2012-07-10 38 views
2

我目前得到了下面的代码,它将运行一堆ajax请求(40-50),然后再做一遍。 (所以做他们永远本质上)更好的方式来持续运行ajax请求?

代码:

$(document).ready(function() { 
     window.setInterval(function() { 
      $('div.env').each(function (index, item) { 
       var vm = $(item).text();      
       var env = "http://localhost:56656/HTML" + vm + ".htm"; 
       $.ajax(env, { 
        async: false, 
        URL: env, 
        type: "GET", 
        dataType: "html", 
        success: function (data) { 
         //alert("Colouring"); 
         var style = $(data).filter('div').attr('style'); 
         var styleObj = {}; 
         $.each(style.split(';'), function() { 
          var rule = this.split(':'); 
          styleObj[$.trim(rule[0])] = $.trim(rule[1]); 
         }); 

         $(item).css('background', styleObj.background); 

        }, 
        error: function() { 

         $(item).css('background', '#f00'); 
        } 
       }); 

      }); 

     }, 10000); 
    }); 

正如你所看到的,我目前使用的正在运行的IE浏览器,并偶尔运行在Chrome慢特别慢超时。当我说慢,我的意思是所有的Ajax请求将完成,然后屏幕将刷新与更新。这一直是IE浏览器的情况,偶尔也会出现Chrome浏览器。理想情况下,我希望ajax能够执行请求,更新然后执行下一个ajax请求。

任何更好的方式来不断地做AJAX请求?

谢谢你在前进, 詹姆斯

+0

请求返回的数据是什么? – 2012-07-10 14:13:13

+0

编辑:请求将返回一个小的HTML页面,只有一个div。 – 2012-07-10 14:19:50

+1

40-50?你不能把它们组合成一个请求吗? – 2012-07-10 14:20:27

回答

1

您可能需要使用Caolan's async library。你的代码看起来是这样的(当然也包括async.js后):

$(document).ready(function() { 
    function call() { 
     var calls = []; 
     $('div.env').each(function (index, item) { 
      calls.push(function(callback) { 
       $.ajax({ 
        // DO NOT USE async: false!!!! 
        // some ajax settings 
        complete : function() { 
         callback(); 
        } 
       }); 
      }); 
     }); 
     async.parallel(calls, function() { 
      /* This will fire when every call finishes. 
       You may want to add timeout here, or else 
       you will end up flooded with requests. */ 
      call(); 
     }); 
    }; 
}); 

你应该把它调整到您的需要(async可以处理错误,以及,阅读文档)。你说你希望他们一个接一个地开火,所以用async.series而不是async.parallel

BTW这段代码:

$.ajax({ 
    async: false 

纯粹的邪恶!!!阻止其他脚本甚至整个浏览器!这可能是你“慢眨眼”问题的原因。

0

不确定在你的情况下是否可能,但是像SignalR或Node.Js + Socket.IO这样的websocket/long polling解决方案通常会更好地继续轮询。

0

您应该使用setTimeout()代替setInterval()并执行以下操作:

  • 如果请求失败,做任何你想做:)
  • 如果请求成功,与召回setTimeout()
0

我认为这是一个架构问题,而不是其他问题。

我会建议重建结构数组发送到服务器,并发送合并成一个HTML页面或json object

这样做的原因是报价明显的反应,你无论做什么, 40-50个并发ajax请求请求将最明确地总是缓慢,因为即使您的ajax成功处理程序(您绑定成功的函数)在10ms内完成(由于它的复杂性,它肯定不在IE上),40请求意味着至少400毫秒专用时间,导致客户端性能问题。在你的情况,

async: false 

即使添加请求时,该独占时间,因此,如果您的要求在10毫秒(可能性很小)完成,您使用的客户端独占时间400ms的另一个。

因此,在客户端搜索解决方案并不是真正的选择。