2011-09-30 83 views
5

最近我开发了一个项目,我在单个aspx页面发送多个ajax请求。我也提出了一个计时器,这个请求发生间隔5秒。 一切似乎都正常工作,直到突然响应混淆。我知道我可以用一个请求做同样的事情,但我想知道为什么会发生这种情况。我环顾了互联网,但我还找不到任何解决方案。我现在实际上采用了这种编码方式,就像做出一个带有多个结果的请求一样,但是我想知道如何做出多个ajax请求,但是响应不会混淆。 这是我的示例代码:Ajax多个请求在同一时间

$(document).ready(function() { 
     var a = setInterval("request1()", 5000); 
     var b = setInterval("request2()", 5000); 
    }); 

function request1() { 

     $.ajax({ 
      url: 'ajaxhandler.aspx?method=method1' , 
      beforeSend: function (xhr) { 
       xhr.overrideMimeType('text/plain; charset=utf-8'); 
      }, 
      success: function (data) { 
        alert(data); 
      } 

     }); 
    } 


function request2() { 

     $.ajax({ 
      url: 'ajaxhandler.aspx?method=method2' , 
      beforeSend: function (xhr) { 
       xhr.overrideMimeType('text/plain; charset=utf-8'); 
      }, 
      success: function (data) { 
        alert(data); 
      } 

     }); 
    } 
+1

混合起来?在异步环境中,您无法保证哪个呼叫会先返回。 – Joe

回答

4

如果需要的要求,以便发生,你不应该使用AJAX(第一个“一”是“异步”)。

为了解决这个问题,您可以在回调中调用request2()来获得第一个请求的“成功”。

function request1() { 
    $.ajax({ 
     url: 'ajaxhandler.aspx?method=method1' , 
     beforeSend: function (xhr) { 
      xhr.overrideMimeType('text/plain; charset=utf-8'); 
     }, 
     success: function (data) { 
       request2(); 
     } 

    }); 
} 
2

这不是JavaScript错误,它是因为您在同一时间调用单个页面而搞砸了。如果你有两个服务器端页面为你的两个AJAX文件,那么它会没事的。尝试为您创建两个不同的aspx文件,以便让不同的methods将它们一起呼叫。

但这不是一个好的做法。为什么不将该方法作为参数发送,并针对不同的方法在aspx文件中有条件?然后,如果您同时使用两种(或更多)方法,则只需通过一次调用即可将这两种方法发送到服务器。您将保存一个HTTP标头并为您的通话延迟通话。

function requestAll() { 

     $.ajax({ 
      url: 'ajaxhandler.aspx' , 
      data: ['method1', 'method2'], 
      beforeSend: function (xhr) { 
       xhr.overrideMimeType('text/plain; charset=utf-8'); 
      }, 
      success: function (data) { 
        alert(data); 
      } 

     }); 
    } 
1

正如已经指出,你不能保证的顺序返回结果。但是,如果有必要能够确定这一点,你可以想见,创建一个唯一的标识符,每进行一次异步请求,然后相应地理清传入的响应。

我看到这样一个解决方案很有用的例子是在击键时执行操作(例如onkeyup)。在做这样的事情时,您可能希望对时间戳,版本号或类似内容进行编码,以便保证某种顺序。如果用户试图搜索“test”,则有可能在“te”的响应之前返回“tes”的自动填充响应。如果您只是简单地覆盖自动填充数据,那么显然这不会是您想要的行为,因为您可能会显示当前搜索标记的结果不正确。

对时间戳(或唯一ID,计数器,版本号,密钥等)进行编码将允许您检查此项以验证您是否拥有最新的响应,或者如果您使用时间戳对结果进行排序需要保证订单等。

2

下面的函数将接受一个JSON请求的url数组,并在所有请求完成后用一组结果调用回调。它可以很容易地适应非JSON的使用。

这个想法是在数据到达时将传入的响应隐藏到数组中,然后只在所有结果都进入时才调用回调。这种方法是批量更新DOM的好方法,并且避免每个计时器都有一个计时器你想要更新的节点。

function multi_getJSON(urls, callback) 
{ 
    // number of ajax requests to wait for 
    var count = urls.length; 

    // results of individual requests get stuffed here 
    var results = []; 

    // handle empty urls case 
    if(count === 0) 
    { 
     callback(results); 
     return; 
    } 

    urls.forEach(function(url, index) 
    { 
     $.getJSON(url, function(data) 
     { 
      results[index] = data; 
      count = count - 1; 

      // are we finished? 
      if(count === 0) 
      { 
       callback(results); 
      } 
     }); 
    }); 
}