2016-08-03 172 views
0

我想下载之前,打包多个XHR响应转换成一个zip文件XMLHttpRequest onload在完成时破坏响应?

的问题是,当xhr.onload执行完毕我参考了响应被破坏..好像什么深刻copys我做在这个函数内也被销毁。

任何解决方法?

    var zip = new JSZip(); 
        objs.each(function() { 
         var fileName = this.id; 
         var link = this.value; 
         xhr.open('GET', link, true); 
         xhr.responseType = 'arraybuffer'; 
         xhr.onload = function(e) { 
          zip.file(fileName, this.response); 
         }; 
         xhr.send(null); 
        }); 
        zip.generateAsync({type:"blob"}).then(function (blob) { 
         saveAs(blob, "hello.zip"); 
        }); 
+0

1.您只能呼叫一次回复,但您尝试多次呼叫。 2.在生成zip之前,您必须等待所有xhr.onload回调。 3.您为所有条目使用相同的文件名。 – Nosyara

+0

对于多个并发请求,不能使用相同的XHR。 – Barmar

回答

0

在这种情况下,承诺将闪耀:

function urlToPromise(url) { 
    return new Promise(function(resolve, reject) { 
    // create a new xhr each time 
    var xhr = new XMLHttpRequest(); 
    xhr.onload = function(e) { 
     resolve(this.response); 
    }; 
    xhr..... // set the other fields, call send(), etc 
    }; 
} 

var zip = new JSZip(); 
objs.each(function() { 
    var fileName = this.id; 
    var link = this.value; 
    zip.file(fileName, urlToPromise(link)); 
}); 

zip.generateAsync({type:"blob"}).then(function (blob) { 
    saveAs(blob, "hello.zip"); 
}); 

JSZip(V3 +)支持阵列缓冲器而且阵列缓冲器的承诺。 urlToPromise通过提取url来创建承诺,并且zip.generateAsync将在内部等待所有ajax调用来解决。