2014-09-04 45 views
3

在循环和执行下一个调用之前,我将如何等待以前的ajax调用完成?目前代码一直循环并一次执行所有ajax请求!在FOR循环中等待以前的AJAX调用

<script> 
var busy; 

function check(mailpass, proxy){ 
    var post_data = {}; 
    var post_json = ""; 

    post_data['mailpass'] = mailpass; 
    post_data['proxy'] = '108.36.248.67:17786'; 
    post_json = JSON.stringify(post_data); 

    jQuery.ajax({ 
     url: '/postdata' , 
     type: "POST", 
     data: {params: post_json}, 
     success: function(data){ 
      var obj = JSON.parse(data); 

      if(obj.error == 0){ 
       // 
       $("#acc-live").append(obj.msg + "<br/>"); 
      } else if(obj.error == 1){ 
       // 
       $("#socks-die").append(obj.msg+ "<br/>"); 
      } else if(obj.error == 2){ 
       // 
       $("#acc-die").append(obj.msg+ "<br/>"); 
      } 
     } 
    }); 

} 
$(document).ready(function(){ 
    $("#submit").click(function(){ 
     var lines = $("#lines").val().split('\n'); 


     for(var i = 0;i < lines.length;i++){ 
      check(lines[i], '123'); 
     } 

    }); 

}); 
</script> 

回答

3

你可以添加计数器(CURRENTINDEX)和重有点组织代码。

var busy; 
var lines; 
var currentIndex = 0; 

function checkNext(){ 

    if(currentIndex >= lines.length){ 
     console.log('all done'); 
     return; 
    } 

    var mailpass = lines[currentIndex]; 
    var proxy = '123'; 

    var post_data = {}; 
    var post_json = ""; 

    post_data['mailpass'] = mailpass; 
    post_data['proxy'] = '108.36.248.67:17786'; 
    post_json = JSON.stringify(post_data); 

    jQuery.ajax({ 
     url: '/postdata' , 
     type: "POST", 
     data: {params: post_json}, 
     success: function(data){ 
      var obj = JSON.parse(data); 

      if(obj.error == 0){ 
       // 
       $("#acc-live").append(obj.msg + "<br/>"); 
      } else if(obj.error == 1){ 
       // 
       $("#socks-die").append(obj.msg+ "<br/>"); 
      } else if(obj.error == 2){ 
       // 
       $("#acc-die").append(obj.msg+ "<br/>"); 
      } 

      currentIndex++; //Increase the counter 
      checkNext(); 
     } 
    }); 

} 
$(document).ready(function(){ 
    $("#submit").click(function(){ 
     lines = $("#lines").val().split('\n');   
     checkNext(); 
    }); 
}); 
0

只要有它,这样你的函数一旦AJAX请求已成功完成check返回一个回调函数,这样一旦与AJAX请求完成它只会再次启动循环。

function check(mailpass, proxy, callback) { //Callback function passed as a parameter 

    ... 

    success: function(data){ 

     ... 

     callback(); //Invokes the function to start the loop again... 
    } 
} 

然后当你打电话给你重复它的功能...

i = 0; 
var lines = $("#lines").val().split('\n'); 

var loop = function checkLines() 
    i++ 
    if (i < lines.length) { 
     check(lines[i], '123', function() { 
      loop(); //Calls the function to loop again, checking to see if `i` is less than `lines`... 
     }); 
    } 
} 
0

如果你只是想等待完成Ajax调用为什么你不能只让async : false? (虽然我不建议这样

jQuery.ajax({ 
    url: '/postdata' , 
    type: "POST", 
    async : false, // here 
    data: {params: post_json}, 
    success: function(data){ 
     var obj = JSON.parse(data); 

     if(obj.error == 0){ 
      // 
      $("#acc-live").append(obj.msg + "<br/>"); 
     } else if(obj.error == 1){ 
      // 
      $("#socks-die").append(obj.msg+ "<br/>"); 
     } else if(obj.error == 2){ 
      // 
      $("#acc-die").append(obj.msg+ "<br/>"); 
     } 
    } 
}); 

,将使循环等待,直到方法完成其执行