2013-05-06 100 views
0

這是第一個得到一個文件列表,每個文件的功能,它會調用一個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

回答

1

使用一個數組來存儲你的數據

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