单击 formik 表单中的保存按钮时如何组织两个 api 调用
How to organize two api calls when clicking save button in the formik form
假设我们有一个带有保存按钮的表单。一个补丁 api 调用保存了用户在点击保存按钮时填写的大部分字段。但是,我们在表单中有一个复选框字段需要另一个 api 来检查用户权限并在单击保存按钮时保存用户的选择以及其他字段。
例如:
序列 1 补丁 api/1
• 如果此 API 调用成功,则将某些字段更新到数据库。然后继续调用序列2API
序列 2 补丁 api/2
• 如果这个 API 调用 return 出错,则停止调用下一个 API,并且 UI return 是一个 error/warning 信息。更新保存不成功,部分数据已经保存到数据库,误导用户
• 此外,在某些字段中,一旦值已经更新到数据库中。 UI 会将屏幕更新为只读模式,以防止用户更新这些字段。如果 UI 中有指示更新和保存不成功的警告消息,这可能会导致混淆。
序列 3 补丁 api/3
我建议您将第二次调用放在 .then 中的 api 中,然后放在第一个 api 调用之后。这样,如果第一个 api 失败,将出现 1 个错误,客户端将在解决该错误后继续。否则如果你尝试分别调用它们,如果第一个失败,它会转到第二个,如果也失败,将向客户端显示两个错误,这听起来不太用户友好。
另一种处理方法是在 handleSave
函数中使用 async-await,有点像这个伪 javascript 代码:
const handleSave = async () => {
// First API call related to the checkbox
let response = await fetch("apiroute/first-call", { /* ... */ });
// Check if the api call has given an error (this should be adapted to the actual server response returned by your APIs)
if (!response.ok) {
// handle the error related to the checkbox (this is just an example)
setError("You don't have the permission to check this box");
// stop the function here
return;
}
// Second API call
let response = await fetch("apiroute/second-call", { /* ... */ });
if (!response.ok) {
// handle second error related to the fields (also, this is just a minimal example)
setError("There was some error in the submitted fields");
}
}
假设我们有一个带有保存按钮的表单。一个补丁 api 调用保存了用户在点击保存按钮时填写的大部分字段。但是,我们在表单中有一个复选框字段需要另一个 api 来检查用户权限并在单击保存按钮时保存用户的选择以及其他字段。
例如:
序列 1 补丁 api/1
• 如果此 API 调用成功,则将某些字段更新到数据库。然后继续调用序列2API
序列 2 补丁 api/2
• 如果这个 API 调用 return 出错,则停止调用下一个 API,并且 UI return 是一个 error/warning 信息。更新保存不成功,部分数据已经保存到数据库,误导用户
• 此外,在某些字段中,一旦值已经更新到数据库中。 UI 会将屏幕更新为只读模式,以防止用户更新这些字段。如果 UI 中有指示更新和保存不成功的警告消息,这可能会导致混淆。
序列 3 补丁 api/3
我建议您将第二次调用放在 .then 中的 api 中,然后放在第一个 api 调用之后。这样,如果第一个 api 失败,将出现 1 个错误,客户端将在解决该错误后继续。否则如果你尝试分别调用它们,如果第一个失败,它会转到第二个,如果也失败,将向客户端显示两个错误,这听起来不太用户友好。
另一种处理方法是在 handleSave
函数中使用 async-await,有点像这个伪 javascript 代码:
const handleSave = async () => {
// First API call related to the checkbox
let response = await fetch("apiroute/first-call", { /* ... */ });
// Check if the api call has given an error (this should be adapted to the actual server response returned by your APIs)
if (!response.ok) {
// handle the error related to the checkbox (this is just an example)
setError("You don't have the permission to check this box");
// stop the function here
return;
}
// Second API call
let response = await fetch("apiroute/second-call", { /* ... */ });
if (!response.ok) {
// handle second error related to the fields (also, this is just a minimal example)
setError("There was some error in the submitted fields");
}
}