Невозможно обновить переменную из функции Javascript

Я пытаюсь обновить переменную 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);
});

похоже, что getText () возвращает обещание, и поэтому обратный вызов «then» будет асинхронным. Следовательно, вполне возможно, что ваш console.info будет запущен до того, как он будет выполнен, и, следовательно, значение еще не было обновлено.

ADyson 25.04.2018 16:45

Правильно, console.info запускается до getText ()

LazioTibijczyk 25.04.2018 16:51

@LazioTibijczyk, есть ли еще что-нибудь, что вам нужно уточнить, или теперь вы понимаете проблему?

Andrew Lohr 25.04.2018 16:53

@LazioTibijczyk, хорошо, что это подтверждено. Поэтому, если вы хотите увидеть значение, вы можете просто переместить console.info в функцию «then».

ADyson 25.04.2018 16:54

Моя идея заключалась в том, чтобы console.info выполнялся после rows.each (). Теперь я понимаю проблему. Я добавил новый тест it (), и он все равно выполняется последовательно. Спасибо за вашу помощь.

LazioTibijczyk 25.04.2018 16:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
54
1

Ответы 1

Используйте 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, что этот тест является асинхронным и не будет считаться завершенным до тех пор, пока возвращенное обещание не будет разрешено или отклонено. Подробнее об этом здесь.

Другие вопросы по теме