我想一次上傳 20 張照片到 imgur。但我想在每次上傳之間有一定的時間間隔。我正在使用Promise.all([...listof20promises]). 但是現在我想以 1 秒的間隔進行 api 呼叫,而且我應該能夠以.then((responseArray)=>...)我們進入的形式獲得回應Promise.all。
我怎樣才能實作它?
uj5u.com熱心網友回復:
使用async/await和在每次迭代之間有延遲的正常回圈,例如:
const delay = t => new Promise(resolve => setTimeout(resolve, t));
const uploadAll = async files => {
const results = [];
for (const file in files) {
if (results.length) {
await delay(1000); // 1 second
}
const response = await uploadFile(file);
results.push({ file, response });
}
return results;
}
并將其用作
uploadAll([ file1, file2, file3, ... ]).then(results => {
// results[0] = { file, response } where file === file1
// results[1] = { file, response } where file === file2
// ...
});
uj5u.com熱心網友回復:
您可以執行以下操作:
async function upload(files) {
while (files.length) {
await Promise.all(files.splice(0, 20));
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
upload([...]);
請記住,這splice會改變你的陣列。如果你不想這樣,你可以slice像下面這樣使用:
async function upload(files) {
let i = 0;
while (i < files.length) {
await Promise.all(files.slice(i, i = 20));
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
upload([...]);
uj5u.com熱心網友回復:
如果您希望延遲在一個上傳開始到下一次上傳開始之間,您可以映射檔案,使用延遲承諾(取自Yanick Rochon 的答案),當前檔案的索引 * 1000 作為超時,然后呼叫上傳:
const delay = t => new Promise(resolve => setTimeout(resolve, t));
const uploadAll = files => Promise.all(
files.map((file, i) =>
delay(i * 1000).then(() => uploadFile(file))
)
);
Yanick Rochon 的回答與我的主要區別在于,在他的回答中,下一次上傳將在上一個呼叫結束后 1 秒開始,而此代碼將在 1 秒內分派呼叫,即使前一個呼叫仍在等待中.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513494.html
