在下一次迭代之前等待ajax成功

时间:2012-10-23 18:05:40

标签: javascript jquery ajax arrays each

我必须对特定数组执行ajax请求并等待服务器响应,然后再继续循环中的下一次迭代。

我目前同时执行迭代。如何确保成功后才能继续?

感谢您的任何建议。

myArray.each(function(val, index) {
    new Ajax.Request(myUrl + val, {
        onSuccess: function() {
               responseFromServer();
        }
    });
    void(0);
});

4 个答案:

答案 0 :(得分:3)

只有在AJAX请求完成后才能进入下一次迭代。我将使用jQuery来展示一个例子;

function sendRequests(requests) {
    var value = requests.shift();
    $.ajax(myUrl + value).done(function(data){
        if (requests.length > 0) {
            sendRequests(requests);
        }
    });    
}

sendRequests( [1,2,3,4] );

答案 1 :(得分:2)

可能会像这样尝试

function getItem(url, array, index)
{
   new Ajax.Request(url + array[index])
   {
      onSuccess : function()
      {
        responseFromServer(); //assuming this handles the server response
        if (index < array.length)
           getItem(url, array, ++index);
      }
   }
}

然后只需用

调用它
getItem(myUrl, myrray, 0);

基本上,你希望回调在数组中的下一个项目上启动下一个ajaxrequest

答案 2 :(得分:0)

尝试这样的事情。基本上,不是迭代所有元素,而是从数组中取出第一个项,然后发出AJAX请求。然后,当您的请求成功完成后,您将调用下一个项目。

请注意,在此示例中,原始数组已发生变异,在您的情况下可能会也可能不正常。

function invokeAll(myArray)
{
    var val = myArray.shift(); //get the next item to be processed
    if (!val)
        return;
    new Ajax.Request(myUrl + val, {
        onSuccess: function() {
               responseFromServer();
               invokeAll(myArray); //got a successful response, start the next one
        }
    });
}

答案 3 :(得分:0)

您可以为此作业编写一个类,其processNext()函数将处理数组中的所有项目

var arrayProcessor = {
        values: [],
        process: function(arr) {
           arrayProcessor.values = arr;
           arrayProcessor.processNext();  
        },
        processNext: function(){
            if (arrayProcessor.values.length > 0) {
              new Ajax.Request(myUrl + arrayProcessor.values.shift(), {
                  onSuccess: function() {
                       responseFromServer();
                       arrayProcessor.processNext();  
                  }
              });
           }
        },

    }