如何在循环内的javascript中创建waitFor(delay)函数?
我试图在Node.js中的循环中添加延迟。我有一个数组,需要为数组的每个元素调用一个函数。问题是,每个这样的函数调用应该有30秒的间隔。这是我试过的-如何在循环内的javascript中创建waitFor(delay)函数?,javascript,node.js,settimeout,Javascript,Node.js,Settimeout,我试图在Node.js中的循环中添加延迟。我有一个数组,需要为数组的每个元素调用一个函数。问题是,每个这样的函数调用应该有30秒的间隔。这是我试过的- const cprRedshift = async (page) => { let query = "select links from schema.table", links = [], ranks = [] let data = await redshiftSelect(query) data.rows.for
const cprRedshift = async (page) => {
let query = "select links from schema.table", links = [], ranks = []
let data = await redshiftSelect(query)
data.rows.forEach(element => {
links.push(element.links)
})
let hostnames = await getDomainNames(links)
// one way
for(let i = 0; i < hostnames.length; i++){
await setTimeout(async () => await checkPageRank(hostnames[i]), 30000)
}
// another way
let i = 0
while(i < hostnames.length){
await checkPageRank(page, hostnames[i])
setInterval(() => ++i, 30000)
}
}
checkPageRank是同一脚本中的一个函数,我需要为hostnames[]数组中的所有元素调用它,同时在每次调用之间保持30秒的间隔。任何关于如何实现这一目标的想法都将不胜感激。谢谢 下面是一个简化的示例,介绍了执行此类操作的常见模式: const hostnames=[1,2,3,4,5,6]; 函数go索引=0{ //对当前索引执行任何需要执行的操作。 console.loghostnames[index]; //如果我们还没有到达终点,设置一个超时 //使用下一个索引再次调用此函数。 如果hostnames.length>index+1{ setTimeout=>goindex+11000; } } //开球
去 你可以用像
let aWait=(x)=>new Promise((resolve)=>setTimeout(resolve,x));
for(let i = 0; i < hostnames.length; i++){
await checkPageRank(hostnames[i]);
await aWait(30000);
}
然后将循环重写为
let aWait=(x)=>new Promise((resolve)=>setTimeout(resolve,x));
for(let i = 0; i < hostnames.length; i++){
await checkPageRank(hostnames[i]);
await aWait(30000);
}
的变体可能包括传递和使用数组本身,而不是增加计数器:
const hostnames=[1,2,3,4,5,6];
功能go[当前,…剩余]{
//为当前项目执行任何需要执行的操作。
控制台。对数电流;
//如果还有项目,请将超时设置为
//使用剩余项再次调用此函数
如果剩余长度为1.5米{
setTimeout=>goremaining,1000;
}
}
//开球
主机名;哇!我从来没有想过递归,但这太干净了!非常感谢:很高兴能有所帮助。你也可以不增加索引计数器,这对我来说似乎有点优雅,但最终结果是一样的。该死!你真的很喜欢干净的代码。你真漂亮,伙计