2015-02-09 2 views
2

Почему мы должны передать функцию Javascript SetTimeout https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeoutJs: setTimeOut без функции аргумент?

Почему мы не можем сделать ГГ просто как

setTimeOut(1000); 

Могу ли я передать пустую или nonexistant функцию там?

Я хочу просто ждать в цикле for после каждой итерации.

+2

Вы имеете в виду метод 'sleep()' в PHP? В Javascript такой вещи нет. Вы должны сделать это с помощью 'setTimeOut' или' setInterval'. – Michelangelo

+0

Да точно :) sleep() в php настолько удобен. – giorgio79

+0

Я правильно знаю ... надеюсь, что они работают над этим :) – Michelangelo

ответ

5

Javascript однопоточный. Вы можете использовать setTimemout, чтобы отложить операцию, но поток будет продолжен. Так

function some() { 
    doStuff(); 
    setTimeout(otherStuff, 1000); 
    doMoreStuff(); 
} 

doStuff будет работать и doMoreStuff впоследствии, и будет работать otherStuff через секунду. Вот почему бесполезно и невозможно использовать setTimeout в качестве задержки как таковой. Если doMoreStuff следует отложить, вы должны сделать то, что функция задержки:

function some() { 
    doStuff(); 
    setTimeout(doMoreStuff, 1000); 
} 

или оба otherstuff и doMoreStuff с задержкой:

function some() { 
    doStuff(); 
    setTimeout(function() { 
       otherStuff(); 
       doMoreStuff() 
      }, 1000); 
} 

Может быть, мой ответ на this SO-question это полезно тоже.

+0

@Kooilnc Как все эти решения хороши в этой должности ?: [Сообщение] (http://stackoverflow.com/questions/5226285/settimeout-in-a-for-loop-and-pass-i-as-value) , Вы опубликовали хорошее решение, но решения в ссылке работают только с двумя итерациями. С более чем двумя итерациями он просто продолжает стрелять и возвращает вам случайные числа. Было ли изменение в том, как браузеры обрабатывают тайм-ауты в циклах за последние годы? – Michelangelo

+0

@Mikey: проверьте ответ на вопрос, который я связал, и проверил jsfiddle в этом ответе (http://jsfiddle.net/KooiInc/k47rw5o4/) – KooiInc

+0

Спасибо. Объясняет многое. – Michelangelo

2

setTimeout регистрирует даже в цикле событий. Когда JavaScript закончит все текущие инструкции, он вернется в цикл событий и ждет события. Когда он это делает, он вызывает функцию обратного вызова, которая является функцией, которую вы передаете setTimeout.

Чтобы сделать для цикла с SetTimeout, сделать что-то вроде этого:

function loop(i, n) { 
    doStuff(); 
    if (i < n) { 
     setTimeout(function() { 
      loop(i+1, n); 
     }, 1000); 
    } 
}; 
loop(0, 10); 

где я является текущей итерации и п макс итераций

Когда JavaScript не в курсе событий, т.е. это запущенный код, что делает весь браузер безответным. Просто на холостом ходу в течение второй будет делать именно это, поэтому, если вы повторяете 10 раз по циклу, браузер будет не отвечать на запросы в течение 10 секунд

1

->setTimeout(callbackFunction[, interval])

Это можно понять, как вы собираетесь вызвать функцию с указанным именем (Предоставлено вами) после указанного времени.

-> Вы не можете сделать так setTimeOut(1000);, потому что 1000 будет рассматриваться как функция обратного вызова В качестве первого параметра setTimeout() является функцией обратного вызова.

Вы не можете определить функцию как

function 1000() { // Code Resides here. }

потому что ява скрипт не позволяет эти типы имен функций.

-> Вы можете передать анонимную функцию setTimeout() как

setTimeout(function() { // Code resides here. }[, interval]); выше код функции будет выполняться после заданного интервала. Если интервал не задан, он будет выполнен немедленно.

Примечание: - Параметры, приведенные в квадратных скобках ( [,] ) не являются обязательными для передачи.

-> Вы можете обратиться по нижеуказанной нити для вашего использования:JavaScript sleep/wait before continuing

Поскольку эта нить содержит определение функции, которая работает как sleep() на других языках.

Смежные вопросы