javascript - 在双(嵌套)循环内设置延迟(超时)

标签 javascript for-loop garbage-collection settimeout

完全卡住了。

我见过这种在循环迭代之间添加延迟的流行解决方案 ( https://stackoverflow.com/a/3583740 ),但它似乎只适用于单个循环(即未嵌套)。

这是伪代码,

for (var i = 0; i < max; i++){
    for (var j = 0; j < max; j++){  
        pause(1000);         // ideally would just elegantly pause all execution
    }
}

我正在尝试使用 setTimeout(除非存在其他选项!)但我似乎无法理解如何设置它。


上下文 - 它应该暂停足够长的时间以便动画发生。 (根据 i 和 j 的值会出现不同的动画)。

最佳答案

如前所述,您不能真正暂停 javascript 中的执行。虽然一个技巧可能是在延迟队列中收集指令,该队列会自行执行 fifo。例如:

// helper function
var delayed = (function() {
  var queue = [];

  function processQueue() {
    if (queue.length > 0) {
      setTimeout(function () {
        queue.shift().cb();
        processQueue();
      }, queue[0].delay);
    }
  }

  return function delayed(delay, cb) {
    queue.push({ delay: delay, cb: cb });

    if (queue.length === 1) {
      processQueue();
    }
  };
}());

你的例子,重写:

var i = 0, j, max = 3;

for (; i < max; i += 1) {
  for (j = 0; j < max; j += 1) {
    // add function to the queue, shadowing i/j with an IIFE:
    delayed(1000, function(i, j) {
      return function() {
        console.log(i, j);
      };
    }(i, j));
  }
}

演示:http://jsbin.com/kadepage/1/

关于javascript - 在双(嵌套)循环内设置延迟(超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22815790/

相关文章:

Python threading.Thread、范围和垃圾收集

javascript - 注销 session Angular2 NodeJS

javascript - 如何将可排序的 div 拖到外部元素上

java - 将数组转换为多维数组 - Java

python - 循环内循环 python

c# - Timer(callback,...) 回调函数是否添加到堆栈中?垃圾收集Q与此

.net - 等效于.NET中的SoftReference?

javascript - 生成按钮并使用构造函数添加方法

javascript - Leaflet 中使用 GEOJSON 的可变折线权重

c++ - 防止输入小于 0 的字母或数字