JS中的订购超时

时间:2018-08-10 05:30:37

标签: javascript timeout

如果我要一次又一次执行多个超时,可以通过哪种方式完成? 如果我有

setTimeout('one', 6000);
setTimeout('two', 500);
setTimeout('three', 4000);
setTimeout('four', 2000);

它将按以下顺序执行:2-> 4-> 3-> 1 ...如何更正此错误,以使代码在正确执行所有计时的情况下起作用?

2 个答案:

答案 0 :(得分:0)

为什么不像这样设置它们?

setTimeout('one', 6000);
setTimeout('two', 6500);
setTimeout('three', 10500);
setTimeout('four', 12500);

或者,您可以使用回调或Promise。在我的其他答案here上查看有关如何完成此操作的示例。

答案 1 :(得分:0)

如果将时间拉入数组,则有很多选择。

例如,您可以创建一个递归函数,该函数从数组中移出一个值,然后调用自身,直到没有更多的时间为止:

function go(times) {
  if (times.length < 1) return
  let t = times.shift()
  setTimeout(() => {
    console.log("calling timeout", t)
    go(times)
  }, t)
}
const delays = [6000, 500, 4000, 2000]
go(delays)

您还可以使用类似reduce的方法将以前的时间逐步添加到当前时间,以一次正确的时间一次完成所有timeOuts:

[6000, 500, 4000, 2000].reduce((total, time) => {
  setTimeout(() => console.log(time), total + time)
  return total+time
}, 0)

您也可以将超时包装在promise中,并使用async/await

const timeout = (time) =>  new Promise(resolve => setTimeout(()=>resolve(time), time))

async function go(times) {
  for (time of times){
    console.log(await timeout(time))
  }
}

go([6000, 500, 4000, 2000])

相关问题