.each()等待迭代完成,然后再进行异步请求

时间:2020-06-24 15:36:40

标签: javascript jquery xmlhttprequest

我有一个表格,可以通过API上传到Dropbox。通过将文件分成多个块并将这些块发送到Dropbox来工作。

这些块必须一个接一个地上升。因此,第一个请求已发送,第二个不能发送,直到第一个请求完成。更不用说不同的块必须到达不同的端点。

为此,我继续在.each()循环中使用syncronus请求,以便该过程在发送下一个块之前将等待。

我的下面的代码。

我的问题是,当发送大文件(150MB +)时,浏览器开始调整,然后该表单就没用了。

我的问题是,我该如何异步发出这些请求,并仍然按正确的顺序上传它们,并且仅在发送了前一个块之后才发送一个块。

knpv_chunked_upload(chunks){

var dropbox = this;

//Send each chunk to Dropbox
jQuery(dropbox.chunks).each(function(index, chunk){

    //This request is for the first chunk
    if (index == 0) {
        
        var xhr = new XMLHttpRequest(); 
        xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/start', false); 
        xhr.setRequestHeader('Authorization', 'Bearer access_key');
        xhr.setRequestHeader('Content-Type', 'application/octet-stream');
        xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({close:false}));                 

    }

    //This request is for the middle chunks
    if (index >= 1 && index < dropbox.chunks.length - 1) {
        
        var xhr = new XMLHttpRequest(); 
        xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/append_v2', false); 
        xhr.setRequestHeader('Authorization', 'Bearer access_key');
        xhr.setRequestHeader('Content-Type', 'application/octet-stream');
        xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
                'close':false,
                'cursor': {
                    'session_id': dropbox.session_id,
                    'offset': dropbox.knpv_offset(index)
                }
            })
        );

    }

    //This request is for the last chunk
    if (index == dropbox.chunks.length - 1) {

        var xhr = new XMLHttpRequest(); 
        xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload_session/finish', false);    
        xhr.setRequestHeader('Authorization', 'Bearer access_key');
        xhr.setRequestHeader('Content-Type', 'application/octet-stream');
        xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
                'cursor': {
                    'session_id': dropbox.session_id,
                    'offset': dropbox.knpv_offset(index)
                },
                'commit': {
                    'path': dropbox.folderpath+'/'+chunk.name,
                    'mode': 'overwrite'
                }
            })
        );

    }

    //Send the chunk
    xhr.send(chunk);            
    

})

}

0 个答案:

没有答案