Небольшая помощь с кодом JavaScript с использованием метода setTimeout () - PullRequest
2 голосов
/ 04 июня 2011

Я пытаюсь понять две вещи об этом коде:

var updateFn = function(num){
   return function(){
      if(num == 6){
         console.info("100%, all items saved!")
      }
      else{
         var i = num/6;
         var pct = Math.round(100 * i);
         console.info(pct + "% saved");
      }
  };
};

for (var i = 1; i < 7; i++){
   setTimeout(updateFn(i), i * 500);
}
  1. Согласно тому, что я прочитал о синтаксисе setTimeout ();

    setTimeout("javascriptstatement",milliseconds);
    

    Итак, почему я должен увеличивать миллисекунды каждого цикла до общего времени до 500 * 6 мс?Почему setTimeout(updateFn(i), 500); не работает должным образом?

  2. Почему я должен возвращать функцию для функции, переданной в качестве первого параметра setTimeout?

    Почему нетне эта работа?:

    var updateFn = function(num){
          if(num == 6){
             console.info("100%, all items saved!")
          }
          else{
             var i = num/6;
             var pct = Math.round(100 * i);
             console.info(pct + "% saved");
          }
    
    };
    
    for (var i = 1; i < 7; i++){
       setTimeout("updateFn(i)", i * 500);
    }
    

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 04 июня 2011
  1. Кажется, он устанавливает 6 тайм-аутов на каждые 500 мс.Я думаю, setInterval может быть лучше здесь.

  2. Вы хотите вернуть функцию, потому что, если вы передаете строку в setTimeout, она получает eval ed, и если вы передаетефункция, которую он просто запускает.

Кажется, этот код создает индикатор выполнения для операции сохранения, хотя предполагается, что сохранение займет 3 секунды, и счетчик будет увеличиваться каждые 1/2 секунды.возможно, не лучшая идея.

В любом случае, вместо установки 6 таймаутов, было бы лучше использовать setInterval.

var updateFn = function(num){
  if(num == 6){
     console.info("100%, all items saved!");
     clearInterval(saving);
  }
  else{
     var i = num/6;
     var pct = Math.round(100 * i);
     console.info(pct + "% saved");
  }
};

var count = 1
var saving = setInterval(function(){
    updateFn(count++);
}, 500);
0 голосов
/ 04 июня 2011

Для 1: нет причины (правка: нет, есть: откладывается на выполнение через 500 мс после другого. Как кто-то заметил, setInterval - это путь туда), очевидно: возможно, автору нужен способ для симуляциинекоторый эффект «замедления» в фиктивной функции сохранения.

Для 2: чтобы setTimeout работал, вы НЕ должны возвращать функцию, но вы ДОЛЖНЫ делать то, как написан этот код: первый параметрsetTimeout - это некоторый код, который должен быть выполнен, и он вполне стандартен для передачи функции setTimeout (например, анонимной).Как в:

setTimeout(function() {
   console.log("Hello world, 2 sec in the future");
}, 2000)
0 голосов
/ 04 июня 2011

setTimeout(updateFn(i), 500); работает как задумано , но, вероятно, не так, как вы надеетесь, что это сработает.

Вы в основном создаете 6 тайм-аутов, которые выполняются в одно и то же времямс с этого момента).

Если вы хотите, чтобы они создавались на расстоянии 500 мс друг от друга, то setTimeout(updateFn(i), i * 500); является правильным способом сделать это (или поместить setTimeout(updateFn(i), 500); внутри функции updateFn).Если вы хотите, чтобы они происходили каждые 500 мс, вы также можете использовать setInterval.

...