有沒有辦法限制for in回圈內部有異步等待 api 呼叫的 Javascript 回圈?這里的問題是 API 端點每個請求的速度限制為 1 秒,并且一些回傳錯誤statusText: 'Too Many Requests',因此目標是限制回圈以每秒命中 API(API 回傳資料的順序不是在這個用例中關注)。有沒有辦法用當前的實作來做到這一點,或者節流不適用于這個實作?
const getProductSales = async () => {
const products = [...] // array of product slugs
const productSales = []
for (const product in products) {
try {
const response = await axios.get(
`https://www.someapi.com/api/v1/sales/${product}`
)
productSales.push(
{
product: product,
sales: response
}
)
} catch (err) {
console.error(err)
}
}
return productSales
}
uj5u.com熱心網友回復:
使用set timeout這可以完成。設定超時是一個回呼函式,所以等待我們可以使用https://stackoverflow.com/a/72408587/10772577中的這個睡眠函式。
const sleep = (time) => {
return new Promise((resolve) => setTimeout(resolve, Math.ceil(time * 1000)));
};
const getProductSales = async () => {
const products = [...] // array of product slugs
const productSales = []
for (const product in products) {
try {
const [ response ] = await Promise.all([
axios.get(
`https://www.someapi.com/api/v1/sales/${product}`
),
sleep(1)
]);
productSales.push(
{
product: product,
sales: response
}
)
} catch (err) {
console.error(err)
}
}
return productSales
}
在這里,我在Promise.all()中添加了睡眠,因此請求每秒發生的次數不應超過一次。
uj5u.com熱心網友回復:
您可以嘗試像這樣限制它:
...
const apiPromise = axios.get(`https://www.someapi.com/api/v1/sales/${product}`)
const throttlePromise = new Promise((res) => setTimeout(res, 1000)) //resolves after one second
const responses = await Promise.all([apiPromise, throttlePromise ])
const response = responses[0]
...
Promise.all()將接受一組承諾并在所有結果都解決后解決一組結果。因此,如果 api 請求的時間短于一秒,它將在繼續回圈之前等待該 throttlePromise。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/482811.html
標籤:javascript for循环 异步等待
上一篇:數字顯示不正確
