2015-12-16 163 views
2

如果满足某个条件,我想延迟在forEach循环中调用另一个函数,但是在这种情况下我不了解setTimeout。setTimeout for for each循环

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 
+2

使其5000 *指数 – juvian

+0

JS触发超时功能异步,这意味着循环结束,并且setTimeout的回调在5秒后被调用。循环本身并不等待回调被调用。所以两个回调几乎同时发生。 @juvian的评论是一种解决方法,以获得所需的行为 – martinczerwi

+0

问题是,您的超时时间同时被创建。 setTimeout释放主线程以继续,所以两个呼叫立即发生(几乎)。如果你做什么@juvian说超时的索引时间会更长。 – Liam

回答

4

如其他人一样有5秒的延迟上面提到的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等

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++; 
     }   
    }) 
+2

请不要只是转储代码,没有任何解释 - 甚至不清楚你没有经过仔细检查就改变了什么。 –

+0

好点@JamesThorpe用于档案参考索引'只有在setTimeout启动时才增加 –