Angular 4 setTimeout()具有可变的延迟和等待

时间:2018-08-31 07:20:49

标签: javascript angular typescript

我有一个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);
}

5 个答案:

答案 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);