Это связано с тем, что все функции, которые вы передаете then
, закрываются по переменной i
, а не по значению этой переменной при создании функций. Поэтому позже, когда функции вызываются, все они видят значение i
таким, какое оно есть затем, после завершения цикла (100).
Если вы хотите зафиксировать значение i
таким, какое оно есть при создании функции, вы можете использовать Function#bind
ES5:
for ( i = 0; i < 100; i++) {
browser.manage().logs().get('browser').then(function(index, browserLog) {
console.log(index);
}.bind(null, i));
}
bind
возвращает новую функцию, которая при вызове вызовет исходную функцию с заданным значением this
(в данном случае я использую null
) и любыми аргументами, которые вы сопровождаете, за которыми следуют аргументы, переданные функции bind
.
Другой подход - это функция строителя:
for ( i = 0; i < 100; i++) {
browser.manage().logs().get('browser').then(buildHandler(i));
}
function buildHandler(index) {
return function(browserLog) {
console.log(index);
};
}
Преимущество этого заключается в том, что вызывающая сторона может управлять this
.
person
T.J. Crowder
schedule
12.11.2014