For循环仅在内部函数完成时继续循环?

问题描述:

这是第一个得到一个文件列表,每个文件的功能,它会调用一个AJAX函数来执行的东西:For循环仅在内部函数完成时继续循环?

function getImagesList(folder) { 
     $.ajax({ 
      type:"POST", 
      url: "getImgList.php", 
      data: {"data":folder}, 
      dataType: "json", 
      success: function (data) { 
       var IsfirstLoggingItem = "true"; 
       for (var key in data) { 
        //alert (data[key]); 
        pdfToImgExec (data[key],IsfirstLoggingItem,folder,1); 
        $('#pdfToImgResult').append('<p>Processing ' + data[key] + ' <img src="loading.gif" height="20" width="20"/></p>'); 
        IsfirstLoggingItem = "false"; 
       } 
       folder == 'Incoming' ? getImagesList('result') : pdfToImgResult(); 
      }, 
      error: function(x, t, m) { 
       $('#pdfToImgResult').html('<p>Error</p>'); 
       alert (t); 
       releaseBtn(); 
      } 
     }); 
    } 

这是被调用函数,它包含一个Ajax功能,可以执行一些

function pdfToImgExec(file,IsfirstLogging,folder,round){ 
      var postString = file + '&' + IsfirstLogging + '&' + folder; 
      $.ajax({ 
       type: "POST", 
       url: "pdfToImgExec.php", 
       data: {"data":postString}, 
       dataType: "html", 
       success: function (data) { 
        if (data) { 
         $('#pdfToImgResult').html('').append('<p>Finish processing ' + file + '</p>'); 
        } else if (!data && round < 4) { 
         $('#pdfToImgResult').html('').append('<p>Encounter error in processing ' + file + ' , retrying ' + round + ' round </p>'); 
         round++; 
         pdfToImgExec(file,IsfirstLogging,folder,round); 
        } 
       }, 
       error: function(x, t, m) { 
        $('#pdfToImgResult').html('errpr'); 
        alert (t); 
        releaseBtn(); 
       } 
      }); 
    } 

总之,getImagesList功能得到一个文件列表,每个文件,调用pdfToImgExec功能做一些Ajax的工作人员。问题是,它不会等待ajax工作人员完成,而是开始下一个循环。

这意味着,我想例如file1运行ajax staff => file1完成ajax staff => file2运行ajax staff => file2 finish =>检查结果

但是,目前的情况是file1运行ajax staff => file2运行ajax staff => check result =>文件1光洁度/ FILE2完成

我曾尝试异步:假,缓存:在这两个函数假,但它似乎没有任何帮助,如何解决呢?感谢

+1

你可以设置在'getImgList.php'回调作为setInterval的基础功能,将循环当'pdfToImgExec.php'做这件事。这些是相同的后端?为什么如果这两个操作之间存在如此紧密的相关性,后端不会考虑这两个操作? – gillyspy 2013-05-06 03:24:12

+0

对不起,你的意思是后端可以处理没有任何php代码的执行顺序? – user782104 2013-05-06 04:11:36

+0

我给你两个选择。第一种选择是通过'setInterval'通过“监视”来控制循环的前端方式。第二个选项......如果你控制后端,那么我将向一个执行这两个步骤的后端服务发出一个AJAX请求。 – gillyspy 2013-05-06 14:25:01

使用一个数组来存储你的数据

var dataArr=[]; 

在你的第一个功能,将数据推送到阵列

function getImagesList(folder) { 
    $.ajax({ 
     type:"POST", 
     url: "getImgList.php", 
     data: {"data":folder}, 
     dataType: "json", 
     success: function (data) { 
      dataArr = data; 
      doProcessData(); 
     }, 
     error: function(x, t, m) { 
      $('#pdfToImgResult').html('<p>Error</p>'); 
      alert (t); 
      releaseBtn(); 
     } 
    }); 
} 

功能doProcessData像这样:

function doProcessData(itemDoneCallback, allDoneCallback) { 
    if(typeof(itemDoneCallback)==undefined)itemDoneCallback=function(){}; 
    if(typeof(allDoneCallback)==undefined)allDoneCallback=function(){}; 
    if(arrData.length>0){ 
    var key = arrData[0]; 
      $.ajax({ 
       //option here like your function pdfToImgExec 
       success: function (data) { 
        arrData.splice(0,1);//remove first data. 
        doProcessData();// call to process next data. 
        itemDoneCallback(); // callback to process some thing 
       } 
      })     
    }else{ 
     allDoneCallback();// all done callback 
    } 
} 

希望这有助于!

+0

谢谢,我想知道如果一个PHP文件包含'exec('....')',ajax调用是否会在exec完成后执行成功funciton,或者只有调用'exec'命令后才执行成功funciton? – user782104 2013-05-06 04:13:23

+0

对不起,我不知道PHP的:) – 2013-05-07 02:21:13