如果我要一次又一次执行多个超时,可以通过哪种方式完成? 如果我有
setTimeout('one', 6000);
setTimeout('two', 500);
setTimeout('three', 4000);
setTimeout('four', 2000);
它将按以下顺序执行:2-> 4-> 3-> 1 ...如何更正此错误,以使代码在正确执行所有计时的情况下起作用?
答案 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])