Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向循环添加超时延迟_Javascript_Typescript_Firebase - Fatal编程技术网

Javascript 向循环添加超时延迟

Javascript 向循环添加超时延迟,javascript,typescript,firebase,Javascript,Typescript,Firebase,我需要更新firestore集合,其中每个文档都需要外部API调用。我使用的API限制为每10毫秒1个请求,因此在不超过配额限制的情况下,我尝试更新100个元素的集合 async function timeout(ms:number) { return new Promise(resolve => setTimeout(resolve, ms)); } async function update(): Promise<void>{ const requests : bird

我需要更新firestore集合,其中每个文档都需要外部API调用。我使用的API限制为每10毫秒1个请求,因此在不超过配额限制的情况下,我尝试更新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)
})} 
异步函数超时(ms:number){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
异步函数更新():Promise{
常量请求:bird[]=[]
const charts=await db.collection(“charts5D”).get()
charts.forEach(异步(doc)=>{
等待超时(1000)。然后(异步()=>{
//执行网络请求的代码
const request=req(选项)。然后(异步(响应)=>{}
请求。推送(请求)
})
})
返回承诺。所有(请求)。然后(()=>{
console.log(“kk”)
}).catch((错误)=>{
console.log(错误)
})} 

我人为地增加了1s的长延迟,以确保延迟正常工作,但似乎只有在循环第一次运行时超时才起作用,之后它仍然会发出请求,而没有任何延迟,并且我从api得到了太多的请求响应。我试着简单地执行
等待超时(1000)
只需在下面添加请求代码,但仍然不起作用

设置超时功能会在浏览器中添加一个计时器,并在指定的毫秒过后执行其中的代码

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

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

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秒后启动,以此类推