【问题标题】:setTimeout/setInterval with multiple delays to execute codesetTimeout/setInterval 有多个延迟来执行代码
【发布时间】:2012-10-30 19:34:52
【问题描述】:

我有一个存储了多个延迟的数组:myArray[8000,4000,3000,6000,5000]。我需要setTimeout/setInterval 运行每个延迟,然后执行一段特定的代码。比如:

myArray[0]=8000;
myArray[1]=4000;
myArray[2]=3000;
myArray[3]=6000;
myArray[4]=5000;

for(var k=0;k<5;k++)
{
    setTimeout(function() {

console.log("CODE TO BE EXECUTED");

    }, diffArray[k]);
}

所以最终的结果是等待 12 秒运行代码,等待 4 秒运行代码,等待 3 秒运行代码,等待 6 秒运行代码,然后等待 5 秒运行代码。当前代码同时运行它们。

我知道这很可能需要通过递归来完成,我已经尝试了一些方法来让它工作,但没有运气。我让它以一种方式工作,但不幸的是它锁定了 UI 线程,我需要在运行时在 UI 中执行其他操作。对此的任何帮助将不胜感激!

【问题讨论】:

  • 我没有看到你的代码有什么大问题。 (除了diffArray 应该是myArray....)
  • 应该是“结果将等待 8 秒运行代码”,不是吗?

标签: javascript arrays settimeout delay setinterval


【解决方案1】:

你应该创建另一个函数,以便每次都复制 k 变量,因为 setTimeout 是一个异步操作:

var func = function(k)
{
  setTimeout(function() {
    console.log("CODE TO BE EXECUTED");
    }, diffArray[k]);
}

for(var k=0;k<5;k++)
{
  func(k)
}

【讨论】:

  • 这不会改变/修复这里的任何事情。 diffArray[k] 在调用 setTimeout(..) 之前已经评估为一个值,因此 k 在闭包中捕获没有问题;没有“按顺序”运行的原始问题仍然存在。
【解决方案2】:

按顺序运行 setTimeout。您正在同时运行所有 setTimeout 。

myArray[0]=8000;
myArray[1]=4000;
myArray[2]=3000;
myArray[3]=6000;
myArray[4]=5000;
var k =0;
    function repeat(){
       if(k == myArray.length) return;
      setTimeout(function() {
              repeat();
              console.log("CODE TO BE EXECUTED");

      }, myArray[k]);
     k++;
  }

【讨论】:

  • 那么你应该把它标记为答案@user830524
【解决方案3】:

您提到 12 秒,但没有那么大的值。如果您希望代码运行 8 秒、12 秒、15 秒、21 秒和 26 秒,那么:

var delay =0;
for(var k=0;k<5;k++){
   delay+=myArray[k];
   setTimeout(function() {
      console.log("CODE TO BE EXECUTED");
   }, delay);
}

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 2020-07-22
    • 2014-09-25
    • 2019-04-14
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多