Существует два три решения для этого.Вы можете либо создать IIFE (по старинке) и установить локальную переменную для «копирования» переменной из вашего цикла:
.then(function(val) {
(() => {
var localKey = key;
// ...
// localKey will be preserved since it's encapsulated
// in its own functional scope
})();
}
Или вы можете использовать более элегантный Array.forEach
Метод ES6:
keys.forEach((key) => {
var val = // ...
// No need to copy key here since we're in a new functional
// scope by the nature of .forEach
});
Оба метода по существу работают одинаково - вы сохраняете переменную, создавая новую функциональную область для каждой итерации цикла.
Надеюсь, что это поможет немного прояснить ситуацию.
РЕДАКТИРОВАТЬ
Я пропустил самое простое * решение: использовать let
или const
в цикле for вместоvar
.Это работает, потому что let
и const
имеют область видимости вместо области функций. Эта статья помогает объяснить это. Итак:
for (var i in keys) {
const key = keys[i];
// ...
// key will be preserved in block
}
Лично я бы предпочел Array.forEach
только потому, что он выглядит проще и защищает вас от необходимости беспокоиться о том, какую область вы ''
* Самое простое: я понятия не имел до момента.