Javascript 让xmlhttprequest等待,告诉我从处理程序获得响应?

Javascript 让xmlhttprequest等待,告诉我从处理程序获得响应?,javascript,php,ajax,xmlhttprequest,Javascript,Php,Ajax,Xmlhttprequest,嗨,我制作了一个Ajax上传表单,它可以处理多个文件 我使用XMLHttpRequest();发送请求,但我真正想做的是让表单一次发送一个文件(发送第一个文件,然后等待upload.php响应,然后发送下一个文件) 我一直在尝试,但没有成功: function _(el){ return document.getElementById(el); } function uploadFile(){ var file = _("file").files; var formdata= new Form

嗨,我制作了一个Ajax上传表单,它可以处理多个文件

我使用XMLHttpRequest();发送请求,但我真正想做的是让表单一次发送一个文件(发送第一个文件,然后等待upload.php响应,然后发送下一个文件)

我一直在尝试,但没有成功:

function _(el){
return document.getElementById(el);
}

function uploadFile(){
var file = _("file").files;
var formdata= new FormData();
var ajax;
for(var i=0;i<file.length;i++){
formdata.append("file[]",file[i]);
ajax= new XMLHttpRequest();
ajax.upload.addEventListener("progress",progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler,false);
ajax.open("POST","Upload.php");
ajax.send(formdata);
}

}  
function progressHandler(event){
_("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total;    
var percent= (event.loaded / event.total) * 100;
_("progressBar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploading... please wait";
}

function completeHandler(event){
_("status").innerHTML = event.target.responseText;  
_("progressBar").value = 0;

}
函数(el){
返回文档.getElementById(el);
}
函数uploadFile(){
var file=uU8;(“文件”).files;
var formdata=new formdata();
var-ajax;

对于(var i=0;i如果在循环中运行此函数,则循环不会等待任何异步操作。我认为,更好的方法是使用某种堆栈,在该堆栈中,您将拥有您的文件。而不是创建一个方法,在调用时只发送一个文件。要更好地理解,请参阅下面的示例:

var files;

function _(el) {
    return document.getElementById(el);
}

function uploadFiles() {
    files = _("file").files;
    sendFile();                        // start sending files
}

function sendFile() {
    // checking, that there is any file to upload yet
    if (files.lenght == 0) {
        completeHandler();
        return true;                   //  upload is complete, you don't want to continue this method any more
    }

    var index = (files.length - 1);    // current file
    var file = files[index];           // sending only one file per call - the last item of files variable
    var formdata= new FormData();

    formdata.append("file[]",file);    // inserting current file
    files.splice(index, 1);            // don't forget to remove current file from the stack, otherwise you'll get an infinite loop

    var ajax = new XMLHttpRequest();

    ajax.upload.addEventListener("progress",progressHandler, false);
    ajax.addEventListener("load", sendFile, false);      // on complete call this method again to send another file
    ajax.addEventListener("error", errorHandler, false);
    ajax.addEventListener("abort", abortHandler,false);
    ajax.open("POST","Upload.php");
    ajax.send(formdata);

    return true;                       // on send return true as a success (not so important)
}
其他处理程序方法将是原始的