是否可以在jQuery中进行半异步ajax调用?

时间:2011-08-02 22:29:13

标签: javascript jquery ajax asynchronous

我正在开发一个涉及循环数组的站点,对每个元素使用jQuery ajax调用。这是一个简化版本:

var myArray=new Array("El1","El2","El3","El4");
for(var i=0; i<myArray.length; i++){
     $.ajax({
         url: 'page.php?param='+myArray[i],
         success: function(data){
               //doing stuff with the data
               //this needs to complete before the loop advances
         }
     });
 }

我需要在完成循环之前完成每个调用。我尝试设置async:false,这使得循环正常工作,但这会占用页面的其余部分脚本并导致很多滞后。有什么方法可以防止循环推进直到调用完成,但仍然能够异步运行其他脚本?

3 个答案:

答案 0 :(得分:6)

var idx = 0;
var urls = ["El1","El2","El3","El4"];

var doNextRequest = function() {
    $.ajax({
        url: 'page.php?param=' + urls[idx],
        success: function(data) {
            // ...
            idx++;
            if (idx < urls.length) {
                doNextRequest();
            }
        }
    });
}

doNextRequest();

答案 1 :(得分:3)

如果您使用Array.shift

,则无需循环
var myArray = new Array("El1", "El2", "El3", "El4");

function doRequest() {
    if (!myArray.length) return;
    var current = myArray.shift();
    $.ajax({
        url: 'page.php?param=' + current,
        success: function(data) {
            //doing stuff with the data
            doRequest();
        }
    });
}

答案 2 :(得分:1)

在前一个成功处理程序中调用下一个请求。像这样的东西。 (可能是一个更优雅的结构)。

var myArray=new Array("El1","El2","El3","El4");
var i = 0;

function callAjax()
{
    $.ajax({
        url: 'page.php?param='+myArray[i],
        success: function(data){
            //doing stuff with the data
            //this needs to complete before the loop advances       

            if (i < myArray.length)
            {
                i++;
                callAjax();
            }
        }
    });
}