3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的代碼中有很多重復(fù)項(xiàng)。為了減少代碼重復(fù),您可以創(chuàng)建一個(gè)可以使用適當(dāng)參數(shù)調(diào)用的輔助函數(shù),該輔助函數(shù)將包含刪除產(chǎn)品線和產(chǎn)品的代碼。
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)
)));
}
有了這個(gè)輔助函數(shù),現(xiàn)在您的代碼將得到簡化并且沒有代碼重復(fù)。
現(xiàn)在要達(dá)到預(yù)期的結(jié)果,您可以使用以下方法之一:
不要使用兩個(gè)單獨(dú)的承諾鏈,而只使用一個(gè)刪除產(chǎn)品線然后刪除產(chǎn)品的承諾鏈。
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
}
}
您可以在代碼中改進(jìn)的另一件事是使用Promise.all而不是forEach()方法來發(fā)出刪除請求,上面的代碼使用Promise.all內(nèi)部deleteHelper函數(shù)。

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的代碼(以及所有其他答案)正在delete按順序執(zhí)行請求,這是對時(shí)間的巨大浪費(fèi)。Promise.all()您應(yīng)該并行使用和執(zhí)行...
// 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貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
所有 HTTP 請求都是異步的,但您可以使其類似同步。如何?使用異步等待
假設(shè)您有一個(gè)名為 的函數(shù)retrieveProducts,您需要?jiǎng)?chuàng)建該函數(shù)async然后await讓響應(yīng)繼續(xù)處理。
留給:
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)
})
}
但請記住,它不是同步的,它一直是異步的
添加回答
舉報(bào)