向循环添加超时延迟



我需要更新firestore集合,其中每个文档都需要外部API调用。我使用的API每10ms有一个请求限制,所以在不超过配额限制的情况下,我试图更新我的100个元素的集合

async function timeout(ms:number) {
return new Promise(resolve => setTimeout(resolve, ms)); 
}
async function update(): Promise<void>{
const requests : bird<void>[] = [] 
const charts = await db.collection("charts5D").get()
charts.forEach(async(doc)=>{
await timeout(1000).then(async()=>{
// code that does a network request
const request = req(options).then(async(response)=>{} 
requests.push(request)

})
})
return Promise.all(requests).then(()=>{
console.log("kk")
}).catch((error)=>{
console.log(error)
})} 

我人为地添加了一个1的长延迟,以确保延迟有效,然而,似乎只有循环第一次运行超时时才有效,之后它仍然会在没有任何延迟的情况下发出请求,并且我从api得到了Too Many requests响应。我试着简单地做await timeout(1000),并在下面添加请求代码,但这仍然不起作用

setTimeout函数为浏览器添加一个计时器,并在指定的毫秒后执行里面的代码。

这里的问题是,您正在对所有它们调用setTimeout(1000(,其间没有任何延迟。延迟仅在调用setTimeout函数后开始计数。因此,1秒后,你所有的计时器都启动了,它们都解决了。

要解决此问题,请将图表的索引传递到超时函数参数中,如下所示:

charts.forEach(async(doc, index)=>{
await timeout(index*1000).then(async()=>{
// code that does a network request
const request = req(options).then(async(response)=>{} 
requests.push(request)       
})
})

因此,第一个计时器将在1秒内启动,第二个计时器在2秒内启动,等等。

最新更新