Задать вопрос

Как выполнить синхронно цикл в nodeJS?

Здравствуйте, нужно выполнить итерации по порядку, как этого добиться в nodeJS?

Есть код:
for(var i = 1; i <= 10; i++) {
	setTimeout(function(){
		console.log('Индекс: ' + i);
	}, 5000 / i);
}


На выходе получаем: Индекс: 11, Индекс: 11, Индекс: 11, Индекс: 11, Индекс: 11...
Как получить: Индекс: 10, Индекс: 9, Индекс: 8... ?
  • Вопрос задан
  • 3914 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
dizballanze
@dizballanze
Software developer at Yandex
Как-то так :)
for(var i = 0; i <= 10; i++) {
    console.log('Индекс: ' + i);
}


или если нужно асинхронно, то используем замыкания:
for(var i = 0; i <= 10; i++) {
  (function(i) {
  setTimeout(function(){
    console.log('Индекс: ' + i);
  }, 5000 / i);
  })(i);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
index0h
@index0h
PHP, Golang. https://github.com/index0h
var func = function (i) {
    return function () {
        console.log('Индекс: ' + i);
    };
};
for(var i = 0; i <= 10; i++) {
  setTimeout(func(i), 5000 / i);
}


Только i != 0, потому как деление на 0 будет

Как получить: Индекс: 0, Индекс: 1, Индекс: 2, Индекс: 3... ?

Не катит, у вас i увеличивается, а задержка уменьшается, будет в обратном порядке. 10 -> 1
Ответ написан
Комментировать
nalomenko
@nalomenko
Руководитель отдела разработок в студии «Lava»
Почитайте про область видимости переменных, а также, если захотите, про замыкания в Javascript. Это целиком и полностью поможет Вам понять, где допущены критические ошибки в Вашем коде.
Ответ написан
Комментировать
@vmb
А что если использовать "use strict"; и let вместо var? На io.js работает, но не знаю, как там в Node вашей версии с поддержкой let. Правда, порядок индексов у меня обратный: 0, 10, 9... И это логично, судя по задаваемому в таймере интервалу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы