2016-08-03 5 views
0

私は..問題はxhr.onloadが応答に私の参照を実行して行われているときが破壊されていることであるXMLHttpRequest onloadが完了するとレスポンスが破棄されますか?

ダウンロードする前に、zipファイルに複数のXHR応答をパッケージ化しようとしているが、私が作る任意の深い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.応答を1回だけ呼び出すことはできますが、複数回呼び出すことができます。 2. zipを生成する前に、すべてのxhr.onloadコールバックを待つ必要があります。 3.すべてのエントリに同じfileNameを使用しています。 – 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呼び出しが解決するまで内部的に待機します。

関連する問題