我有一个timestamp
的事件列表。
我要显示的事件基于timestamp
:
要添加延迟:
delay = timestamp(t+1) - timstamp(t)
我知道这不适用于setTimeout
,但是有一种解决方法,如果超时是恒定的,就我而言不是。
是否可以让下一个setTimeout()
等待上一个?具体来说,如果第一个setTimeout()
有5秒的延迟,而第二个有3秒,则第二个将首先出现。我希望它们的顺序相同,但要一个接一个地执行。
此示例适用于恒定的延迟,但是我想根据对列表进行迭代的信息来计算延迟。
for (i = 1; i <= 5; ++i) {
setDelay(i);
}
function setDelay(i) {
setTimeout(function(){
console.log(i);
}, 1000);
}
答案 0 :(得分:3)
在这里您可以使用IIFE (Immediately Invoked Function Expression)和函数递归,例如:
var i = 0;
(function repeat(){
if (i++ > 5) return;
setTimeout(function(){
console.log("Iteration" + i);
repeat();
}, 5000);
})();
小提琴here。
答案 1 :(得分:1)
在使用最新的Typescript或ES代码时,我们可以为此使用aync / await。
Boole[0 < x < 1] Limit[(1 + a^(-1)), a -> Infinity]
我们需要将for循环包装在异步立即调用的函数中,因为要支持await。
我们还需要一个超时功能,一旦超时完成,该功能将返回一个承诺。
此后,我们等待超时完成,然后继续循环。
答案 2 :(得分:0)
您可以想到这样的东西:
setDelay(1,5);
function setDelay(i, max) {
setTimeout(function(){
console.log(i);
if(i < max){
i++;
setDelay(i, max);
}
}, 1000);
}
这个想法是设置超时中的下一个setTimeout(..
。
当然,您也可以对其进行修改,使其具有不同的长时间超时。
希望我能帮助您:)
答案 3 :(得分:0)
您可以使用i值动态设置超时期限。喜欢
for (i = 1; i <= 5; ++i) {
setDelay(i);
}
function setDelay(i) {
setTimeout(function(){
console.log(i);
}, i*1000);
}
答案 4 :(得分:0)
不要在循环中调用它,因为它不会等待setTimeout
完成。
您可以改为传递要等待的时间列表,然后递归地对其进行迭代:
let waits = [5000, 3000, 1000];
function setDelay(times) {
if (times.length > 0) {
// Remove the first time from the array
let wait = times.shift();
console.log("Waiting", wait);
// Wait for the given amount of time
setTimeout(() => {
console.log("Waited ", wait);
// Call the setDelay function again with the remaining times
setDelay(times);
}, wait);
}
}
setDelay(waits);