2013-05-06 4 views
0

Вот функция первого получения списка файлов, для каждого файла, он будет вызывать АЯКС функцию, чтобы выполнить что-то:Для продолжения цикла цикла, когда функция внутри завершена?

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(); 
      } 
     }); 
    } 

Это функция вызываемая, она содержит функцию АЯКС выполнить что-то

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 running ajax staff => file1 finish ajax staff => file2 running ajax staff => file2 finish => проверить результат

Однако в текущей ситуации файл1 работает ajax staff => file2 running ajax staff => check result => file1 finish/file2 finish

Я попытался async: false, cache: false в обеих функциях, но, похоже, не помогает, как его исправить? благодаря

+1

вы можете настроить обратный вызов в 'getImgList.php' как функцию, основанную на setInterval, которая будет циклически выполняться при выполнении' pdfToImgExec.php', это дело. Это те же самые бэкэнды? Почему бэкэнд не заботится обо всех этих операциях, если существует такая плотная корреляция между этими двумя операциями? – gillyspy

+0

Извините, вы имеете в виду, что серверы могут обрабатывать порядок выполнения без какого-либо php-кода? – user782104

+0

Я предлагаю вам два варианта. первый вариант - это интерфейсный способ управления циклом путем «контроля» его через 'setInterval'. по второму варианту ... Если вы управляете бэкэнд, я бы сделал один запрос AJAX на один серверный сервис, который выполняет оба действия. – gillyspy

ответ

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 funciton после выполнения exec или только после вызова команды exec? – user782104

+0

извините, я не знаю php :) –

Смежные вопросы