如何在循环内的 javascript 中创建 waitFor(delay) 函数?
How can i make a waitFor(delay) function in javascript inside a loop?
我正在尝试在 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 = ["one", "two", "three", "four", "five", "six"];
function go (index = 0) {
// do whatever you need to do for the current index.
console.log(hostnames[index]);
// if we haven't reached the end set a timeout
// to call this function again with the next index.
if (hostnames.length > index + 1) {
setTimeout(() => go(index + 1), 1000);
}
}
// kick it off
go();
您可以使用
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 = ["one", "two", "three", "four", "five", "six"];
function go ([current, ...remaining]) {
// do whatever you need to do for the current item.
console.log(current);
// if there are items remaining, set a timeout to
// call this function again with the remaining items
if (remaining.length) {
setTimeout(() => go(remaining), 1000);
}
}
// kick it off
go(hostnames);
我正在尝试在 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 = ["one", "two", "three", "four", "five", "six"];
function go (index = 0) {
// do whatever you need to do for the current index.
console.log(hostnames[index]);
// if we haven't reached the end set a timeout
// to call this function again with the next index.
if (hostnames.length > index + 1) {
setTimeout(() => go(index + 1), 1000);
}
}
// kick it off
go();
您可以使用
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 = ["one", "two", "three", "four", "five", "six"];
function go ([current, ...remaining]) {
// do whatever you need to do for the current item.
console.log(current);
// if there are items remaining, set a timeout to
// call this function again with the remaining items
if (remaining.length) {
setTimeout(() => go(remaining), 1000);
}
}
// kick it off
go(hostnames);