Да кажем, че трябва да изпълним асинхронна задача вътре в цикъла For. Вижте този пример по-долу:

Познайте стойността на iprint от конзолата. Ако познаете 0 и 1, значи грешите.
Нека обясня защо.

forцикълът се изпълнява незабавно, за да завърши. Няма да чака асинхронните операции да започнат или да приключат.
Когато те завършат известно време в бъдещето и извикат своите обратни извиквания, стойността на променливата на вашия индекс на цикъл iще бъде на последната си стойност за всички обратни извиквания.

Така че резултатът ще бъде 2 & 2.

Има две решения за този проблем.

  • Създайте функция за затваряне и запазете индекса на цикъл отделно за всяко обратно извикване.

  • Решение ES6, използвайте letза дефиниране на променлива на forloop. Като letе блокиран обхват и уникално дефиниран за всяка итерация.

Проверете на живо: https://jsbin.com/mawimehixa/1/edit?js,console