0

此代码段允许将多个文件拖放到一个框中。文件阅读器为每个文件创建一个 blob,然后每个文件都应该使用 ajax rq 发送到服务器:

$.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);
}

问题:当接收到下一个 blob 而没有处理前一个 blob 时,服务器内部崩溃。

我发现另一个帖子讨论这个:如何使所有 AJAX 调用顺序? 使用 async:false 的“顺序”请求不是一种选择,它会阻止很多其他事情。

解决方案: ???为file1调用ajax,调用完成后,为file2调用ajax,...为file-n调用ajax

我真的很想使用 JQ Deferred ( 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。

4

2 回答 2

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

这与嵌套回调几乎相同,具有可读性和捕获所有错误的额外好处

于 2014-10-24T20:57:48.747 回答
0

那么有一个插件队列插件:

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

它是由 John Resig 自己编写的。

于 2011-09-15T13:32:13.897 回答