2015-05-04 2 views
0

Из всех вопросов, которые я видел на этом сайте о setTimeout, большинство из них выполняет этот метод в объявлении setTimeout. Я этого не делаю.setTimeout Node v0.12 срабатывает сразу в цикле?

Код:

var nums = [1,2,3,4,5,6,7,8,9]; 

for(var i=0; i < nums.length; i++){ 
    setTimeout(function(num){ 
    var url = getUrl(num); 
    //query(url); // prints out query operation and data return 
    console.log(num); 
    }, 1000, nums[i]); 
} 

При выполнении команды, чтобы запустить приложение, запрос не будет выполнять все элементы в массиве независимо от того, насколько большой я установить задержку миллисекунды. При запуске этого кода при печати на консоль я получаю тот же эффект. Я делаю это неправильно? Может ли кто-нибудь еще дублировать это?

Я создал приложение, которое будет запускать setInterval для тестирования api throttling, и оно работает так, как ожидалось. Я думаю, что я могу пропустить какие-то бэкэнд-знания об узле с помощью setTimeout и циклов? setTimeout Docs

Документы говорят, что это не гарантирует времени, когда он выполнит обратный вызов, но у меня есть 120 элементов, которые он собирается запустить, и он запускает их все сразу.

+1

Это то, что вы просите об этом: он будет оценивать все 9 вызовов через 1 секунду. – zerkms

+1

Вы настраиваете 9 вызовов 'setTimeout()', которые все настроены для запуска через 1 секунду. – jfriend00

+0

Ах, хорошо, что было бы более разумно, почему люди умножают индекс на сумму задержки. – Rizowski

ответ

0

поскольку те функции setTimeout или setInterval работает асинхронно, Вы должны вызвать следующий цикл в/setInterval функцию обратного вызова SetTimeout.

var _i = 0 
var doQuery = setInterval(function(){ 
    if(_i == nums.length) clearInterval(doQuery); 
    var url = getUrl(nums[_i]); 
    query(url); 
    _i++; 
},1000); 
Смежные вопросы