【问题标题】:Loop inside a loop循环内循环
【发布时间】:2014-06-18 14:52:09
【问题描述】:

好的,所以我需要在循环内运行超时,而无需重新调用循环。内部循环需要超时。

(function loaded() {
for(var i=0;i<100; i++){
  if(!SOMECONDITION){
     setTimeout(loaded, 1);
  }
}
})();

这段代码几乎可以完美运行,除非条件不满足,它会调用整个循环。我需要它只在这样的循环内调用..但它不起作用。

    for(var i=0;i<100; i++){
(function loaded(i) {
      if(!SOMECONDITION){
         setTimeout(loaded, 1);
      }
})(i);
    }

变量 i 必须能够在循环中传递。

【问题讨论】:

  • 你为什么要这样写代码?看来您正在尝试以 Javascript 的速度快速轮询,以使您的条件为真。这通常是一种糟糕的编程方式。它会扼杀移动设备的电池寿命。它占用 CPU 周期。而且,最重要的是,你同时做 100 个这样的事情。这种技术简直太离谱了。您需要更好的方法。
  • 我不知道您正在测试的 SOMECONDITION 是什么,但您应该想办法从任何代码更改该条件的情况下创建某种通知,以便您可以在 SOMECONDITION 时直接收到通知可能有不同的价值。然后,您的代码只需要在该通知处理程序中,您就不会影响 CPU 和电池。您可以使用回调或自定义事件或您自己的通知机制。

标签: javascript timeout


【解决方案1】:

有点复杂,也许有人可以简化,但是...我认为您需要两个函数,一个将i 捕获到一个闭包中,一个没有参数,因此可以将其称为超时。

for (var i = 0; i < 100; i++) {
  (function(i) {
    function loaded() {
      if (!SOMECONDITION) {
        setTimeout(loaded, 1);
      }
    };
    loaded();
  })(i);
};

【讨论】:

  • 有道理,但是 i 变量可以从条件块中访问吗?
  • OP 需要一种更好的方法来解决他们的问题,而不需要快速轮询 100 个 setTimeout() 调用,所有这些调用都试图同时运行。我知道您实际上是在尝试回答他们的编码问题,但他们真正需要的是一种更好的方法,以便在条件可能发生变化时得到通知,然后再进行检查。 CPU、电池、其他浏览器标签等...会更快乐。
  • @jfriend00:哦,我完全同意。
  • @Violet:是的,可以。外部匿名函数的参数将被内部匿名函数的闭包捕获。但是请注意 jfriend00 提出的问题 - 这是一个经典的 XY 问题,很可能有更好的方法来做你最终想做的事情。
  • 我提供给 Amadan 的代码与我的实际代码相差甚远。 Amadan 提供了答案。 @jfriend,我的目标实际上是几乎同时运行 100 个超时调用
猜你喜欢
  • 2012-12-22
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2016-05-13
相关资源
最近更新 更多