2016-08-03 213 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調用來解決。