3 回答
TA贡献1828条经验 获得超4个赞
您的代码中有很多重复项。为了减少代码重复,您可以创建一个可以使用适当参数调用的辅助函数,该辅助函数将包含删除产品线和产品的代码。
async function deleteHelper(getURL, deleteURL) {
const response = await axios.get(getURL);
const ids = response.data.value;
return Promise.all(ids.map(id => (
axios.delete(deleteURL + id)
)));
}
有了这个辅助函数,现在您的代码将得到简化并且没有代码重复。
现在要达到预期的结果,您可以使用以下方法之一:
不要使用两个单独的承诺链,而只使用一个删除产品线然后删除产品的承诺链。
const prodLineGetURL = 'https://myapi.com/ProductLine?select=id';
const prodLineDeleteURL = 'https://myapi.com/ProductLine/';
deleteHelper(prodLineGetURL, prodLineDeleteURL)
.then(function() {
const prodGetURL = 'https://myapi.com/Product?select=id';
const prodDeleteURL = 'https://myapi.com/Product/';
deleteHelper(prodGetURL, prodDeleteURL);
})
.catch(function (error) {
// handle error
});
使用async-await语法。
async function delete() {
try {
const urls = [
[ prodLineGetURL, prodLineDeleteURL ],
[ prodGetURL, prodDeleteURL ]
];
for (const [getURL, deleteURL] of urls) {
await deleteHelper(getURL, deleteURL);
}
} catch (error) {
// handle error
}
}
您可以在代码中改进的另一件事是使用Promise.all而不是forEach()方法来发出删除请求,上面的代码使用Promise.all内部deleteHelper函数。
TA贡献1860条经验 获得超8个赞
您的代码(以及所有其他答案)正在delete按顺序执行请求,这是对时间的巨大浪费。Promise.all()您应该并行使用和执行...
// Delete Product Lines
axios.get('https://myapi.com/ProductLine?select=id')
.then(function (response) {
const ids = response.data.value
// execute all delete requests in parallel
Promise.all(
ids.map(id => axios.delete('https://myapi.com/ProductLine/' + id))
).then(
// all delete request are finished
);
})
.catch(function (error) {
})
TA贡献1775条经验 获得超11个赞
所有 HTTP 请求都是异步的,但您可以使其类似同步。如何?使用异步等待
假设您有一个名为 的函数retrieveProducts,您需要创建该函数async然后await让响应继续处理。
留给:
const retrieveProducts = async () => {
// Delete Product Lines
const response = await axios.get('https://myapi.com/ProductLine?select=id')
const ids = response.data.value
ids.forEach(id => {
axios.delete('https://myapi.com/ProductLine/' + id)
})
// Delete Products (I want to ensure this runs after the above code)
const otherResponse = await axios.get('https://myapi.com/Product?select=id') // use proper var name
const otherIds = response.data.value //same here
otherIds.forEach(id => {
axios.delete('https://myapi.com/Product/' + id)
})
}
但请记住,它不是同步的,它一直是异步的
添加回答
举报