2011-09-15 136 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 
}); 

这几乎是同样的事情与可读性的好处和捕获所有的错误嵌套回调解决排队它们无需插件