2 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
Jeremy 是對(duì)的,您await的代碼中有不必要的 s,但主要問(wèn)題是您通過(guò)將catch處理程序放在 promise from 上post然后讓該處理程序完成而不拋出錯(cuò)誤或返回任何內(nèi)容來(lái)隱藏 promise 拒絕。這將拒絕變成了價(jià)值的實(shí)現(xiàn)undefined。
刪除catch處理程序(可能)或讓它返回一些你可以用來(lái)知道post失敗的東西。
FWIW,這是一個(gè)執(zhí)行上述操作并使用 的Array.from映射功能的示例(因?yàn)槟谶M(jìn)行映射操作);看評(píng)論:
const doUpload = async (fileList: FileList) => {
? // Use `map`
? const requests = Array.from(fileList, file => {
? ? const formData = new FormData();
? ? const blob = new Blob([file]);
? ? formData.append(file.name, blob);
? ? // No need for `await` here
? ? return axios.post(
? ? ? 'https://jsonplaceholder.typicode.com/posts',
? ? ? {
? ? ? ? ...formData,
? ? ? },
? ? ? {
? ? ? ? headers: {
? ? ? ? ? 'Content-Type': 'multipart/form-data',
? ? ? ? },
? ? ? ? onUploadProgress: (progressEvent: ProgressEvent) =>
? ? ? ? ? handleUploadProgress(progressEvent, file.lastModified),
? ? ? }
? ? );
? ? // No `.catch` here (or have one, but make it return something useful
? });
? try {
? ? const data = await Promise.all(requests);
? ? console.dir(data);
? } catch (error) {
? ? console.log(error);
? }
};
如果你需要handleUploadError
在那里的某個(gè)地方打電話,你可能會(huì)考慮使用Promise.allSettled
(相對(duì)較新的)而不是Promise.all
然后調(diào)用它來(lái)為它給你的數(shù)組中的任何被拒絕的承諾。
...當(dāng)使用 Promise.all 解析時(shí)。
只是一個(gè)旁注:使用Promise.all
不會(huì)“解決”您傳遞給它的承諾。它只是觀察他們發(fā)生了什么。Promise.all
承諾會(huì)解決,但無(wú)論您使用與否,它們都會(huì)解決。
一些可能有用的承諾術(shù)語(yǔ):
fulfill?- 將 promise 狀態(tài)從pending更改為fulfilled并具有特定的fulfillment 值
reject?- 將 promise 狀態(tài)從pending更改為rejected并給出特定的拒絕原因
resolve?- 直接(通過(guò)履行或拒絕)或間接(通過(guò)使其結(jié)果取決于另一個(gè)承諾的結(jié)果)來(lái)確定承諾的最終結(jié)果

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在將已解決的承諾推送到您的數(shù)組 ( requests.push(await axios.post()))。只需推送 Promises 而無(wú)需等待它們(requests.push(axios.post()))。然后就Promise.all可以做它的工作了。
const doUpload = async(fileList: FileList) => {
const requests: Array < void | Promise<any> > = [];
Array.from(fileList).forEach( file => {
const formData = new FormData();
const blob = new Blob([file]);
formData.append(file.name, blob);
requests.push(axios.post(/* ... */ ));
});
try {
const data = await Promise.all(requests);
console.dir(data);
} catch (error) {
console.log(error);
}
};
添加回答
舉報(bào)