【发布时间】:2023-03-05 09:21:01
【问题描述】:
我需要编辑以前保存的包含附件的邮件。在编辑功能中,用户应该能够编辑邮件标题或文本、替换现有附件或删除附件。
场景:用户对消息文本进行了更改,替换了一个附件并删除了 2 个附件并点击了保存。 OnClick 的 Save 按钮,需要发生以下动作
- 先异步替换和删除 API 调用
- 如果替换和删除成功,则调用 api 保存对文本的更改
这就是我所在的地方..
Promise.all 中的Promise.all 中的replace 和delete 在循环promise 完成之前执行,导致外部promise(在handleSave 中)总是得到一个resolved 的promise。
deleteData 和 replaceData 是包含要替换/删除的数据的数组
const delete = () => {
if (deleteData.length > 0) {
return Promise.all([
deleteData.map(data => fetch(url)
.then((response) => {
if (!response.ok) {
throw new Error('Delete Failed');
}
})
),
]).then(() => Promise.resolve('Deleted'));
}
return Promise.resolve('Nothing to delete');
};
const replace = () => {
if (replaceData.length > 0) {
return Promise.all([
replaceData.map(data => fetch(url)
.then((response) => {
if (response.status === 400) {
response.text().then((error) => {
const errorObject = JSON.parse(error);
throw new Error(error);
});
} else if (!response.ok) {
throw new Error('Update Failed');
}
})
),
]).then(() => Promise.resolve('Replaced'));
}
return Promise.resolve('Nothing to replace');
};
const saveMessage = () => {
fetch(saveUrl)
.then((response) => {
if (response.status === 400) {
response.text().then((error) => {
const errorObject = JSON.parse(error);
throw new Error(error);
});
} else if (!response.ok) {
throw new Error('Save Failed');
}
});
}
const handleSave = () => {
Promise.all([replace, delete])
.then(() => {
saveMessage();
}).catch((e) => {
//Catch action
})
}
【问题讨论】:
-
你的
save没有返回任何东西,你可能想要returnfetch 调用,以便它可以在下面的handleSave 中被捕获
标签: javascript reactjs loops promise fetch