Цикл for
будет зацикливать все элементы до того, как первый setTimeout
будет запущен из-за его асинхронного характера.К тому времени, когда ваш цикл запустится, i
будет равно 5
.Следовательно, вы получаете один и тот же вывод пять раз.
Вы можете использовать метод из класса Array
, например .forEach
:
Это гарантирует, что функция включена.
[0, 1000, 2000, 3000, 4000].forEach((t, i) => {
setTimeout(function() {
console.log(i);
console.log(`key_${i}`);
//do stuff here
}, t)
});
Примечание: Я бы посоветовал вам не использовать alert
во время работы / отладки, поскольку это, честно говоря, довольно запутаннои раздражает работать с.Лучше всего использовать простой console.log
.
Некоторые дополнительные пояснения к коду:
.forEach
принимает в качестве основного аргумента функцию обратного вызова для запуска каждого элемента.Этот обратный вызов может сам принимать два аргумента (в нашем предыдущем коде t
было значением текущего элемента и i
индексом текущего элемента в массиве):
Array.forEach(function(value, index) {
});
Но вы можете использовать Синтаксис функции стрелки вместо определения обратного вызова с помощью function(e,i) { ... }
вы определяете его с помощью: (e,i) => { ... }
.Это все!Тогда код будет выглядеть так:
Array.forEach((value,index) => {
});
Этот синтаксис является более коротким способом определения вашего обратного вызова.Есть некоторые различия, хотя .