idsのリストがfirebaseストレージに送られ、各idのダウンロードURLを取得し、URLを配列と同じ順序で保存する関数を記述しようとしていますids配列。テストでは、ダウンロードURLがランダムな順序で返されることがわかりました。以下は、前述の関数の縮小されたコードです。
1)返されたURLが正しい順序で到着させる方法はありますか?
2)ループの後にsetTimeout関数を使用して3秒間待機しないと、urlsToDownload配列が空になります。すべてのURLがダウンロードされるまで待つより正確な方法はありますか?あなたは何ができるかFirebaseがgetDownloadURLをループで呼び出すと、ランダムな順番で戻ります
function downloadAll() {
var storageRef = firebase.storage().ref("/stuffToDownload");
var urlsToDownload = [];
var downloadIds = ['1', '2'];
for (var x = 0; x < downloadIds.length; x++) {
var downloadId = dowloadIds[x];
(function(did) {
var storageFileRef = storageRef.child(did);
storageFileRef.getDownloadURL().then(function(url) {
urlsToDownload.push(url);
}).catch(function(error) {
console.log("error");
});
})(downloadId);
}
}
}
setTimeout(function() {
console.log("finished getting file urls", urlsToDownload.length);
var index = 0;
for(index = 0; index < urlsToDownload.length; index++){
console.log(index + " " + urlsToDownload[index]);
}
}, 3000);
}
です。 getDownloadURL() 'は非同期です。あなたの 'for'ループは、これらすべての要求を一度に起動します。応答を待つ必要があり、前の応答が到着したときにのみ次の要求を送信する必要があります。 https://stackoverflow.com/questions/4288759/asynchronous-for-cycle-in-javascript –
ありがとう、私はあなたの応答で他の投稿への参照を使用して、私のために働いた –
聞いてうれしい –