如果满足某个条件,我想延迟在forEach循环中调用另一个函数,但在这种情况下我不理解setTimeout。
function checkName(person) {
console.log('checking name of ' + person.name)
if (person.name === 'Julie') return true
}
function checkPersons() {
var persons = [
{name: 'Bob', age: 21},
{name: 'Frank', age: 15},
{name: 'Julie', age: 12}
]
var results = []
persons.forEach(function(person) {
if (person.age >= 18) {
console.log('do not need to check name of ' + person.name)
results.push(person)
} else {
setTimeout(function() {
if (checkName(person)) {
console.log('Julie is ' + person.name)
results.push(person)
}
}, 5000)
}
})
}
checkPersons()
https://jsfiddle.net/nicholasduffy/sy7qpqu1/1/
我得到了
do not need to check name of Bob
// 5 second delay here
checking name of Frank
checking name of Julie
Julie is Julie
每次我需要拨打checkName
do not need to check name of Bob
// 5 second delay here
checking name of Frank
// 5 second delay here
checking name of Julie
Julie is Julie
答案 0 :(得分:4)
正如其他人所提到的,setTimeout是异步的,所以js会在forEach所有超时功能上触发,等待时间为5秒。所以在5秒之后,所有人都在"相同的"时间。
为了避免这种情况,你可以做一个队列并只运行一次超时,当你完成下一次的呼叫时,或者在这种情况下,一个更简单的解决方案是根据你的人的索引调整等待时间正在迭代:
persons.forEach(function(person, index) { // we add index param here, starts with 0
//your code
else{
setTimeout(function() {
if (checkName(person)) {
console.log('Julie is ' + person.name)
results.push(person)
}
}, 5000*(index+1)) // or just index, depends on your needs
}
})
这样,第一个将在5秒后运行,第二个将在10之后运行,第三个将在15之后运行
答案 1 :(得分:0)
var index = 1;
persons.forEach(function(person) {
if (person.age >= 18) {
console.log('do not need to check name of ' + person.name)
results.push(person)
} else {
setTimeout(function() {
if (checkName(person)) {
console.log('Julie is ' + person.name)
results.push(person)
}
}, (index)*5000);
index++;
}
})