如何仅在成功转到下一个循环值时在循环中运行ajax请求?

时间:2013-01-02 09:31:40

标签: javascript jquery ajax loops

我有一个非常基本的方案:运行3 Google地图放置网址并在每次成功时显示结果

这是我到目前为止所做的:

 var  values = ["url1", "url2", "url3"];

  values.forEach(function(value, i) {

     var jsonReq = JSON.stringify({
        action: 101,
        supported: value 
    });

    ...

     $.ajax({
        type: "POST",
        url: "data.ajax.php",
        dataType:"json",
        data:{
            data:jsonReq
        },
        success:function(data){
           // parse results
           ....

        }
    }); 

  });

问题是我在循环中运行所有3个网址而无需等待成功

我只想在从前一个获得响应(回调)时发送下一个请求。

有什么建议吗?

谢谢,

4 个答案:

答案 0 :(得分:5)

尝试递归而不是......像这样

var currentR = 0;
    var  values = ["url1", "url2", "url3"];
    function sendReqests()
    {
       if(!values[currentR])
       return false;
       var jsonReq = JSON.stringify({
            action: 101,
            supported: values[currentR]
        });
       $.ajax({
            type: "POST",
            url: "data.ajax.php",
            dataType:"json",
            data:{
                data:jsonReq
            },
            success:function(data){
             currentR++;  
              if(values[currentR]){
              sendReqests();
              }
            }
        }); 

    }


    // call the recursive function 

    sendReqests();

答案 1 :(得分:3)

在ajax请求中的完整函数中调用下一个请求

var  values = ["url1", "url2", "url3"];

  values.forEach(function(value, i) {

     var jsonReq = JSON.stringify({
        action: 101,
        supported: value 
    });

    ...

     $.ajax({
        type: "POST",
        url: "data.ajax.php",
        dataType:"json",
        data:{
            data:jsonReq
        },
        success:function(data){
           // parse results
           ....

        },
      complete: function(){

      }
   }); 

  })

答案 2 :(得分:1)

您可以使用setTimeout代替循环

var  values = ["url1", "url2", "url3"];
var index = 0;

function repeatedCall(value, i) {

     var jsonReq = JSON.stringify({
                        action: 101,
                        supported: values[index]
                    });
     index++;
     if(index == 4)
         clearTimeout(loop );
     else
         setTimeout(repeatedCall, 0);
}
var loop setTimeout(repeatedCall, 0);

答案 3 :(得分:1)

而不是foreach,您可以使用every,因为every的中断比foreach更容易

var  values = ["url1", "url2", "url3"];
function ajaxCall(value) {
    var jsonReq = JSON.stringify({
        action: 101,
        supported: value 
    });

    $.ajax({
        type: "POST",
        url: "data.ajax.php",
        dataType:"json",
        async: false,
        data:{
            data:jsonReq
        },
        success:function(data){
           // parse results
           // if success
           //       return true
           // else
           //       return false

        }
    });
    return true;
}
values.every(ajaxCall);