私はすべての画像ファイルを含むzipファイルを作成するためにJSzipを使用しています。私はXMLHttpRequestを使ってループ内の外部リンクから画像を取得しました。私のコードzipfileによると、XMLHttpRequestを完了する前に作成します。したがって、空のzipファイルを返します。すべてのファイルをループした後にzipファイルを作成するには?すべてのファイルをループした後にzipファイルを作成する方法は?
$(document).on('click', '.download', function(){
var path = $(this).attr("data-id");
var count = $(this).attr("value");
var storageRef = firebase.storage().ref();
var zip = new JSZip();
console.log(count);
for (i = 1; i <= count; i++) {
console.log(path+i+".png");
var imagePath = path+i+".png";
// Create a reference to the file we want to download
var starsRef = storageRef.child(imagePath);
starsRef.getDownloadURL().then(function(url) {
// Insert url into an <img> tag to "download"
ImageUrl = url;
var xhr = new XMLHttpRequest();
xhr.open('GET', ImageUrl, true);
xhr.responseType = "arraybuffer";
xhr.onreadystatechange = function(evt) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
zip.file(i+".png", xhr.response);
}
}
};
xhr.send();
})
}
zip.generateAsync({type:"blob"})
.then(function(content) {
// see FileSaver.js
saveAs(content, "my.zip");
});
});
をループがある前に、あなたが 'zip.generateAsync'を呼んでいるように思えます'zip.file(i +"。png "、xhr.response);を初めて呼び出す前に実行できるようになりました。ループを 'promise'にラップすると、必要に応じて' zip.generateAsync'をチェーンすることができます。これは、[ループで多くの約束を返して、それらを待つ方法](http://stackoverflow.com/questions/31426740/how-to-return-many-promises-in-a-loop-and-wait -for-them-all-to-do-other-stuff) – Nope
はい。それは私の質問で述べたように問題です。問題は、私は状況を克服する考えがないということです。私はこれがAJAXの要求に対してよりスリムであると思う。 – Bandara
@Franのコメントに加えて、[async calls loop javascriptを待つ]のようなキーワードを使ってSOを検索すると(http://stackoverflow.com/search?q=wait+for+async+calls+loop+javascript)、どのようにこれを行うことができる多くの結果。 – michaPau