javascript - 如何发出两个 axios 请求并将两个响应保存在一个钩子中?
问题描述
我Axios
用来对我的后端进行 API 调用。问题是我想拨打电话,将响应保存在挂钩中,而不是拨打另一个电话并将响应保存在同一个挂钩中。在收到第一个响应后,我必须拨打第二个电话,因为在我的后端,第二个电话会监听 EventEmmiter:
const [invoice, setInvoice] = useState({
loading: false,
error: false,
content: null,
paid: false
});
function createInvoice() {
setInvoice({ ...invoice, loading: true });
api
.post("/lightning/createinvoice", {
amount: values.amount
})
.then(response => {
setInvoice({
loading: false,
error: false,
content: response.data,
paid: false
});
return api.get("/lightning/invoicestatus", {
params: { id: response.data.id }
});
})
.then(response => {
if (response.data.status === "Confirmed")
setInvoice({ ...invoice, paid: true });
})
.catch(() => {
setInvoice({ loading: false, error: true, content: null });
});
}
这段代码有效,但是我得到invoices.content: null
. 我怀疑这会setInvoice({ ...invoice, paid: true });
失败,因为该invoice
州没有最新的状态。
我应该如何解决它?
提前致谢
解决方案
我制作了一种更简洁、更易读的方法,而不仅仅是承诺回调。如果您发现任何问题,请告诉我,因为我不确定您可以测试的实际 API 调用。但是下面的代码应该无论如何都可以工作。
const [invoice, setInvoice] = useState({
loading: false,
error: false,
content: null,
paid: false
});
const createInvoice = async (api, values) => {
try {
setInvoice({ ...invoice, loading: true });
const firstResponse = await api.post("/lightning/createinvoice", {
amount: values.amount
});
setInvoice({
...invoice,
content: firstResponse.data
});
const secondResponse = await api.get("/lightning/invoicestatus", {
params: { id: firstResponse.data.id }
});
if (secondResponse.data.status === "Confirmed") {
setInvoice({ ...invoice, paid: true });
}
} catch (err) {
setInvoice({ loading: false, error: true, content: null });
}
};
推荐阅读
- c# - ASP.NET Core:HttpPost:多个对象,相同的接口。如何在自定义绑定中使用多态性
- javascript - 无法读取 Discord.js 中未定义的属性“xy”
- javascript - 如何通过 onclick 从 mongoose 集合中删除数据?
- python - bitwise_and 方法上的 OpenCV 断言错误
- javascript - 来自 js/html 的 ASP .NET Core 2.2 MVC 传递参数
- php - websockets / MySQL 实时数据的最佳实践
- git - 如何从命令提示符中删除未跟踪的文件?
- apache - 如何使用 htaccess 重定向以公共路径开头的 URL?
- handlebars.js - BigCommerce 价格显示 - 显示原始价格
- asp-classic - 应该为真的 if 语句的问题出现为假