Я пытаюсь обновить переменную rowNumber из rows.each (), однако, когда я впоследствии console.info, она все еще имеет значение null. Что я делаю неправильно? Я даже пробовал определить var rowNumber 'выше', результат тот же.
var licenceNumber = 233521673;
it('should open created Driver Licence', function() {
var rowNumber = null;
var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index'));
rows.each(function(element, index) {
element.getText().then(function (text) {
if (text.includes(licenceNumber)) {
rowNumber = index;
return true;
}
});
});
console.info('rowNumber = ', rowNumber);
});
Правильно, console.info запускается до getText ()
@LazioTibijczyk, есть ли еще что-нибудь, что вам нужно уточнить, или теперь вы понимаете проблему?
@LazioTibijczyk, хорошо, что это подтверждено. Поэтому, если вы хотите увидеть значение, вы можете просто переместить console.info в функцию «then».
Моя идея заключалась в том, чтобы console.info выполнялся после rows.each (). Теперь я понимаю проблему. Я добавил новый тест it (), и он все равно выполняется последовательно. Спасибо за вашу помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте Promise.all, чтобы дождаться, пока все обещания не будут разрешены:
var licenceNumber = 233521673;
it('should open created Driver Licence', function() {
var rowNumber = null;
var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index'));
var promises = [];
rows.each(function(element, index) {
var promise = element.getText().then(function (text) {
if (text.includes(licenceNumber)) {
rowNumber = index;
}
});
promises.push(promise);
});
return Promise.all(promises).then(function () {
console.info('rowNumber = ', rowNumber);
});
});
Обратите внимание, что обещание, привязанное к Promise.all, также возвращается в Mocha. Это важно, потому что он сообщает Mocha, что этот тест является асинхронным и не будет считаться завершенным до тех пор, пока возвращенное обещание не будет разрешено или отклонено. Подробнее об этом здесь.
похоже, что getText () возвращает обещание, и поэтому обратный вызов «then» будет асинхронным. Следовательно, вполне возможно, что ваш console.info будет запущен до того, как он будет выполнен, и, следовательно, значение еще не было обновлено.