我這里有這個功能:
const uploadedFiles: string[] = [];
await Promise.all(
selectedImageUrls.map(async (selectedUrl) => {
const fileName = selectedUrl.startsWith("data:image/png")
? `${id}-${Date.now()}.png`
: `${id}-${getFileNameFromUrl(selectedUrl)}`;
const fileData = await fetch(selectedUrl).then((x) => x.arrayBuffer());
const newUrl = await uploadInvoiceFile(userId, fileName, fileData);
uploadedFiles.push(newUrl);
})
);
所以基本上我有一個名為的陣列selectedImageUrls,我通過這個陣列映射來執行一些異步函式,所以我把這個映射放在 aPromise.all()中,在最后一行,你可以看到在每個映射中,我將異步函式的結果推送到一個的陣列uploadedFiles,但是,此結果與原始陣列 ( selectedImageUrls) 的順序不同。我如何修改此代碼以使順序完全相同?
uj5u.com熱心網友回復:
Promise.all將按照您創建地圖的相同順序回傳請求。但是事情完成的順序可能是亂序的。
因此,您需要做的就是從Promise.all. 例如..
const uploadedFiles = await Promise.all(
selectedImageUrls.map(async (selectedUrl) => {
const fileName = selectedUrl.startsWith("data:image/png")
? `${id}-${Date.now()}.png`
: `${id}-${getFileNameFromUrl(selectedUrl)}`;
const fileData = await fetch(selectedUrl).then((x) => x.arrayBuffer());
const newUrl = await uploadInvoiceFile(userId, fileName, fileData);
return newUrl;
})
);
附言。被視為您使用的 Typescript,好處是它uploadedFiles也將隱含地成為型別string[],當然假設newUrl是一個字串……
還有一個小提示,如果你在async函式中做的最后一件事是回傳一個承諾,你可以跳過臨時變數和await.
例如。
const newUrl = await uploadInvoiceFile(userId, fileName, fileData);
return newUrl;
可以簡化為 ->
return uploadInvoiceFile(userId, fileName, fileData);
uj5u.com熱心網友回復:
在每個映射中,我將異步函式的結果推送到一個名為
uploadedFiles
只是不要那樣做。Promise.all已經創建了一個包含所有承諾結果的陣列,使用它:
const uploadedFiles: string[] = await Promise.all(
selectedImageUrls.map(async selectedUrl => {
const fileName = selectedUrl.startsWith("data:image/png")
? `${id}-${Date.now()}.png`
: `${id}-${getFileNameFromUrl(selectedUrl)}`;
const x = await fetch(selectedUrl)
const fileData = await x.arrayBuffer();
return uploadInvoiceFile(userId, fileName, fileData);
// ^^^^^^
})
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537071.html
