Как дождаться разрешения element.all?

Я пытаюсь найти индекс элемента из списка. Чтобы узнать индекс, я использую эту функцию

    function restFunction(appName) {
     var indexForItem = 0;
     var a = element.all(by.repeater("app in itemList").column("app.itemName")).each(function (element, index) {
            element.getText().then(function (name) {
                console.log("Name is " + name);
                if (name == "sam") {
                    indexForItem = index + 1;
                    console.log("Ïndex is " + indexForItem );
                    a = index;
                }
            });
        });

        return a;
    }

В транспортире, как я могу дождаться выполнения вышеуказанного обещания. Прямо сейчас, когда я вызываю функцию restFunction, я всегда получаю обещание в состоянии ожидания


person SandyRocks    schedule 14.03.2017    source источник


Ответы (1)


Ваш код выглядит некорректно, особенно возвращаемое значение. Вы возвращаете вызов функции - element.all(locator).each(eachFunction), который вернет обещание, которое ни к чему не приведет. Ознакомьтесь с документацией здесь.

Возвращает

!webdriver.promise.Promise Обещание, которое будет разрешено, когда функция будет вызвана для всех ElementFinder. Обещание будет иметь значение null.

Хотя вы переназначаете значение позже внутри вызова, поскольку режим асинхронный, он не ждет повторного назначения.

Вы должны изменить его, чтобы вернуть индекс напрямую

function restFunction(appName) {
    return element.all(by.repeater("app in itemList").column("app.itemName")).each(function (element, index) {
        return element.getText().then(function (name) {
            if (name === "sam") {
                return (index+1);
            }
        });
    });
}

И когда вы вызываете функцию - вы должны разрешить обещание

restFunction('').then(function _resolvePromiseOfCall(value){
    console.log('value')
})
person AdityaReddy    schedule 14.03.2017