2017-04-12 29 views
0

我在與AJAX的什麼我試圖完成固有的異步岬問題上的連續任務...使用Ajax做一套PHP服務器

使用文件上傳表單,我試圖發送一組數據到我的LAMP服務器,然後循環遍歷數據的每個子集併爲每個子集生成一個PDF。這需要2分鐘左右的時間來處理所有的PDF,因爲每個數據子集都有很多(如100)。

我希望能夠使用JavaScript/jQuery將數據分割成我將一次發送到服務器的子集,並且在生成每個PDF時,從服務器獲取響應並增加進度條,然後發送下一個請求。

你會如何在循環中完成此操作?下面的內容不起作用,因爲jQuery不關心服務器的狀態並異步發送所有請求。

var i = 0; 
$.each(data_stuff, function(key, value) { 
    $.post(window.location.href, { 
     stuff: key, 
     data: value 
    }).done(function(data) { 
     if (data == 1) { 
      $('div#counter').text(i); 
     } 
    });       
    $i++; 
}); 

謝謝!

+2

我會推薦使用'Promise's。以下鏈接是一個很好的介紹:https://scotch.io/tutorials/javascript-promises-for-dummies(並且它不只是傻瓜!)特別是,查看鏈接承諾部分。 – nb1987

+1

那麼你試圖做什麼。在所有ajax完成後做一些事情,或者,一個ajax在另一個完成後開始? –

+0

一種方法是一次發送所有數據,並在會話變量中有服務器端腳本更新進度....然後設置另一個長輪詢ajax調用來監視該會話變量的進度 – charlietfl

回答

2

假設data_stuff是一個對象,你可以試試這個:

var i = 0; 

// We need an array (not object) to loop trough all the posts. 
// This saves all keys that are in the object: 
var keys = Object.keys(data_stuff); 

function postNext() { 

    // For every POST request, we want to get the key and the value: 
    var key = keys[i]; 
    var value = data_stuff[key]; 

    $.post(window.location.href, { 
     stuff: key, 
     data: value 
    }).done(function(data) { 
     if (data == 1) { 
      $('div#counter').text(i); 
     } 

     // Increment i for the next post 
     i++; 

     // If it's the last post, run postsDone 
     if(i == keys.length) { 
      postsDone(); 
     } 
     // Else, run the function again: 
     else { 
      postNext(); 
     } 
    }); 
}); 

postNext(); 

function postsDone() { 
    // All data was posted 
} 

這將只發布的data_stuff下位以前$.post做了。

+0

謝謝!這個變化的伎倆! –