Да кажем, че трябва да изпълним асинхронна задача вътре в цикъла For. Вижте този пример по-долу:
Познайте стойността на i
print от конзолата. Ако познаете 0 и 1, значи грешите.
Нека обясня защо.
for
цикълът се изпълнява незабавно, за да завърши. Няма да чака асинхронните операции да започнат или да приключат.
Когато те завършат известно време в бъдещето и извикат своите обратни извиквания, стойността на променливата на вашия индекс на цикъл i
ще бъде на последната си стойност за всички обратни извиквания.
Така че резултатът ще бъде 2 & 2.
Има две решения за този проблем.
- Създайте функция за затваряне и запазете индекса на цикъл отделно за всяко обратно извикване.
- Решение ES6, използвайте
let
за дефиниране на променлива наfor
loop. Катоlet
е блокиран обхват и уникално дефиниран за всяка итерация.
Проверете на живо: https://jsbin.com/mawimehixa/1/edit?js,console