У меня есть эта функция прямо здесь:
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
, и я сопоставляю этот массив для выполнения некоторых асинхронных функций, поэтому я помещаю эту карту внутри Promise.all()
, и в последней строке вы можете видеть, что на каждой карте я нажимаю результат асинхронных функций. в массив с именем uploadedFiles
, однако этот результат не в том же порядке, что и исходный массив (selectedImageUrls
). Как я могу изменить этот код, чтобы порядок был точно таким же?
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);
на каждой карте я помещаю результат асинхронных функций в массив с именем
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);
// ^^^^^^
})
);