使用jQuery同步Ajax

时间:2010-12-11 02:20:47

标签: jquery ajax

我有一个网络应用程序,可以提出大量$.post()个请求。服务器必须按创建顺序接收这些内容。为了保证这一点,我首先想到我自己创建了队列,并在上一个Ajax调用完成后触发了下一个Ajax调用。

然后我看到有一个async:false选项,您可以使用$.ajax()

我已经更改了使用$.ajax({ async: false, ... })的所有请求,但是当我在Firebug中监视它们时,请求不是逐个发送的,每个下一个请求在最后一个请求在收到响应后被触发。

async假设该做什么?我如何管理我的Ajax,以便一次执行,下一个在最后一个完成时触发(收到响应)?

1 个答案:

答案 0 :(得分:7)

您可以创建一个从回调中递归调用的函数,而不是使用async:false

function sendReq( arr ) {
    var current = arr.shift(); // Remove the first item from the Array.
    $.ajax({
        url: current.url,      // Use the url from the first item.
        success: function( dat ) {
            current.func( dat );  // Call the function of the first item.
            if( arr.length )      // If there are items left in the Array,
               sendReq( arr );    //     make a recursive call, sending
        }                         //     the remainder of the array.
    });
}

// Ordered collection of requests to be made.
var req_set = [
    {url:'someurl', func:function( dat ) { /*do something with dat*/ }},
    {url:'anotherurl', func:function( dat ) { /*do something with dat*/ }},
    {url:'someother', func:function( dat ) { /*do something with dat*/ }}
];
 // Start the first call, sending the entire set.
sendReq( req_set );

基本上是这样的:

  • 创建一个包含请求所需元素的对象数组。
  • 创建一个接受数组的函数。
  • 该函数从数组中删除第一项,并使用该对象填充请求属性。
  • 在回调中,在调用该项的函数之后,对函数进行递归调用,传递数组的其余部分。
  • 这将继续递归调用,直到Array为空。