2011-09-15 174 views
0

該代碼片段允許刪除拖入一個框中的多個文件。所述的FileReader創建的每個文件的團塊,然後將每個文件應該使用AJAX RQ被髮送到服務器:接收下一個斑點時 服務器內部崩潰而不是在處理了前一個:jquery多個Ajax請求

$.each(e.dataTransfer.files, function(index, file){ 
    var fileReader = new FileReader(); 

    //..generate BLOB from file 


    fileReader.onloadend = (function(file) {         
     return function(e) {        
      uploadfilelist.append('<li>' + file.fileName + '</li>'); 
      //send every single file to server 
      var destfoldername=CURRENTPATH; 
      var uploadfilename=file.fileName; 

      var fd = new FormData(); 
      fd.append("param1", destfoldername); 
      fd.append("param2", uploadfilename); 
      fd.append("param3", blob); 

      $.ajax({ 
       type:"POST", 
       url:"url", 
       data:fd, 
       contentType: false, 
       processData: false,    
       beforeSend:function (xhr){ 
        //custom headers 
       }, 
       success: function(data, textStatus, jqXHR){ 

       }, 
       complete: function(jqXHR){  
        alert("State after complete: " + jqXHR.statusText);     
       }   
      }); 
     }; 
    })(file); 
    fileReader.readAsBinaryString(file); 
} 

問題。

我發現另一篇文章討論這個:How to make all AJAX calls sequential? 「連續」要求使用異步:假是不是一種選擇,它會阻止一大堆其他東西..

SOLUTION:??? 呼叫AJAX forfile1,當調用完成,調用AJAX的文件2,... AJAX調用文件-N

我真的想用JQ遞延(http://api.jquery.com/category/deferred-object/) 例如如下所述:http://api.jquery.com/jQuery.when/

$.when($.ajax(???how to refer to THIS ajax call).done(function(){ 
//call this ajax for the next file again or use $.ajax(code).then()? 
}); 

我真的很抱歉,但我不知道如何得到它的權利。

感謝您的任何建議! h。

+0

你是否控制服務器端代碼? – Crisfole

+0

不,我可以和控制服務器的人討論,如果你有一個想法:-)它是一個問題.. –

+0

我唯一的想法是編寫服務器,以便它可以處理一次超過一個的事物。你可以做的另一件事是將連續調用嵌套在回調函數中(以便下一個Ajax命令僅在第一次調用成功時被調用)。如果成功並不是你想要做的唯一一次,那麼在所有'成功','失敗:','完成:'功能中都要這樣做。 (一定要在函數中包裝下一個ajax調用,所以你可以在所有需要的地方調用該函數)。 – Crisfole

回答

0

以及有一個插件隊列插件:

http://plugins.jquery.com/project/ajaxqueue

它是由John Resig的本人所寫。

+0

hm謝謝,但頁面上的示例鏈接不起作用,我找不到下載或某事,只是鏈接到appenTo() - 公司。你知道我可以在哪裏下載源代碼,如果它是免費的? –

+0

@ ho.s我已經過時了。對不起。也許是遞歸功能,你在另一個之後做你的請求?我也發現這個:https://gist.github.com/1039247/626f0c8210c8f662011b10b89b89478d58133575看起來像是1.6.x的插件 –

0

你當然可以通過下一個承諾

$.ajax(/*options*/) 
.then(function(res) { 
    // do something with result 
    // call 2 
    return $.ajax(/* options */); 
}) 
.then(function(res) { 
    // call 3 
    return $.ajax(/* options */); 
}) // and so on 
.fail(function(err) { 
    // catch any error from any ajax call 
}); 

這幾乎是同樣的事情與可讀性的好處和捕獲所有的錯誤嵌套回調解決排隊它們無需插件