Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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中创建waitFor(delay)函数?_Javascript_Node.js_Settimeout - Fatal编程技术网

如何在循环内的javascript中创建waitFor(delay)函数?

如何在循环内的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

我试图在Node.js中的循环中添加延迟。我有一个数组,需要为数组的每个元素调用一个函数。问题是,每个这样的函数调用应该有30秒的间隔。这是我试过的-

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; } } //开球
主机名;哇!我从来没有想过递归,但这太干净了!非常感谢:很高兴能有所帮助。你也可以不增加索引计数器,这对我来说似乎有点优雅,但最终结果是一样的。该死!你真的很喜欢干净的代码。你真漂亮,伙计