【问题标题】:Create Loop SetTimeOut Jquery Array创建循环 SetTimeOut Jquery 数组
【发布时间】:2015-01-14 16:12:58
【问题描述】:

我正在尝试在控制台日志浏览器中创建一个带有 setTimeout 的循环。但它不起作用。我尝试搜索但没有找到我需要的东西。基本上在每个循环中,在这个 printa 5sec 的延迟更新期间将有 5 秒的间隔。必须将数组带入循环。

var myArray1 = new Array( "orange", "blue", "white" );

for (var i = 0; i <= myArray1.length; i++) {

  console.log("This fruit" + myArray1[i] + "is delcious!");

  setTimeout(function(){ alert() }, 500); //AFTER FIVE SECONDS

setTimeout(function(){
  } //CLOSE FOR
}, 5000); //AFTER FIVE SECONDS

让我举一个我用过的例子,它可以工作,但是代码太大了。我想要一种更好地理解循环的方法。

var myArray1 = new Array( "orange", "blue", "white" );
var var_time = 7000;

setTimeout(function(){
  console.log("Fruit is " + myArray1[0]);
  console.log("...stage 1 loading");


  setTimeout(function(){
    console.log("Fruit is " + myArray1[1]);
    console.log( "...stage 2 loading");

    setTimeout(function(){
      console.log("Fruit is " + myArray1[2]);
      console.log( "stage 2 finish");

      alert();

      console.log( "You code run perfect");

    }, var_time); //stage 2
  }, var_time); //stage 1
}, 500); //stage 0

【问题讨论】:

标签: javascript jquery loops for-loop settimeout


【解决方案1】:

不漂亮,但简单。

var fruitColors = ["orange", "blue", "white"];

function showColor(index) {
   if (index < fruitColors.length) {
       console.log("Fruit is " + fruitColors[index]);
       setTimeout(function() { showColor(index+1); }, 500);
   }
}

setTimeout(function() { showColor(0); }, 500);

更漂亮但更复杂的方法是:

var fruitColors = ["orange", "blue", "white"];

fruitColors.reverse().reduce(function(m,c) {
    return function() {
       console.log("Fruit is " + c);
       setTimeout(m, 500);
    };
}, function() {})();

您可以阅读reduce here (MDN)

【讨论】:

  • 这段代码违反了“不要重复自己”的原则
  • @Alnitak 是的,但我认为它更容易理解。
  • 他所做的代码是修改并用于我想要的。想说明你们帮了很多忙。但幸运的是,我需要这段代码已经为我服务了。谢谢。 @Alnitak 不会受伤。
【解决方案2】:

我通常的代码是:

var myArray1 = [ "orange", "blue", "white" ];

(function loop() {
    // find first element and do something with it
    var current = myArray1.shift();
    ...

    if (myArray1.length) {
        setTimeout(loop, 5000);
    }
})();  // start immediately

这当然会在循环运行时改变数组 - 如果有问题,请复制一份。

更通用的版本是这样的:

function repeat(array, delay, callback, done) {
    var a = array.slice();
    (function loop() {
        var x = a.shift();
        callback(x);
        if (a.length) {
            setTimeout(loop, delay);
        } else {
            done();
        }
     })();
};

有用法:

repeat(myArray1, 5000, function(f) {
    console.log(f)
}, function() {
    console.log(done);
}

【讨论】:

  • 为什么不setInterval()
  • 当我放console.log("This fruit " + myArray1 + " is delcious!");时,他放了两次,重复了四次,而不是三次
  • 您应该记录“当前”,而不是整个 MyArray1
  • @IsmaelMiguel:两者都是不错的选择,但我认为在这里使用setTimeout 比使用setInterval 更好。因为我们有一个简单的终止条件,所以您可以使用简单的if (current.length) {…} 包装器来停止重复调用,而不必使用keep track of a timer ID
  • @IsmaelMiguel markegli 说了什么。此外,如果错过计时器间隔,setInterval 的行为也会很糟糕。
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 2012-09-19
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多