在等待ajax.done完成时暂停每个循环

时间:2015-09-24 17:24:33

标签: php jquery ajax

我正在使用for each方法迭代一系列命令文件。

对于每个命令文件,我需要等待ajax成功,然后继续执行下一个命令。

问题是for a循环在ajax代码完成之前移动到下一个命令。任何人都可以提供解决方案吗?

对于每个循环:

$.each(cmd_files, function(index, cmd) {

          update_log('Running CMD for' + cmd)

          wait_for_cmd_complete(cmd).done(function(data){

               update_log("CMD is complete");    

          })
 })

Ajax功能:

function wait_for_cmd_complete(cmd){

     return $.ajax({
         type: 'POST',
         data: {cmd:cmd}, 
         url: 'wait_for_cmd_complete.php'
     });  


  }

4 个答案:

答案 0 :(得分:1)

这就是我最终开始工作的原因。

  1. 第一个Ajax请求已完成。

  2. 使用i ++高级cmd文件数组。

  3. 从同一个函数中再次调用Ajax函数。

  4. 如果仍有更多文件要运行,则再次调用该函数,

  5. 在最后一个cmd文件完成后退出函数。

      can :read, User, User.published do |user|
        true
      end
    

    }

答案 1 :(得分:1)

根本不是你如何编写事件驱动的动作。如果您需要下一次代码迭代才能在事件之后启动,那么您就不会遍历迭代...因为这将在事件之前运行所有代码!这就是事件的运作方式。

制作类似这种通用结构的东西,可以更好地在每个事件中运行1次迭代代码:

var i = 0; // the index we're using
var list = []; // array of the things you plan on "looping" through
var max = list.length; // basically how many iterations to do

function nextIteration() {
    if (i >= max) return; // end it if it's done
    // do whatever you want done before the event for this iteration
    list[i].addEventListener("someevent", onEvent); // add whatever event listener
}

function onEvent() {
    // do whatever it is you want done after the event for this iteration
    i++; // up the index
    nextIteration(); // start the next iteration
}

nextIteration(); // start the first iteration manually

为了便于说明,您可以了解正在进行的操作,此处的代码格式与上述代码类似。

var i = 0; // the index we're using
update_log('Running CMDs');
var cmd; // basically a var just so we don't have to keep calling cmd_files[i]
var totalCommands = cmd_files.length; // basically how many iterations to do

function sendNextCommand() {
    if (i >= totalCommands) return; // end it if it's done
    cmd = cmd_files[i]; // again, just so we don't have to keep calling cmd_files[i]
    update_log("Waiting for CMD " + cmd + " to complete...");
    $.ajax({type:'POST', data:{cmd:cmd}, url:'wait_for_cmd_complete.php'}).done(onCommandComplete);
    // above line does what needs to be done (sends to PHP) and then adds the event listener 'done'
}

function onCommandComplete(value) {
    update_log( "    CMD complete for: " + cmd);
    i++; // up the index
    sendNextCommand(); // start the next iteration
}

sendNextCommand(); // start the first iteration manually

答案 2 :(得分:0)

也许尝试链接你的活动。不太熟悉这种方法,但我认为这样可行:

$.each(cmd_files, function(index, cmd) {
            update_log('Running CMD for' + cmd);
            var request =  $.ajax({type: 'POST',data: {cmd:cmd}, url: 'wait_for_cmd_complete.php'});
            request.then( update_log("CMD is complete");        
 });

答案 3 :(得分:0)

使用同步ajax应该可以工作,至少如果你不跨域执行它。 将async: false添加到a​​jax选项。 有关详情,请参阅herehere