Разрешить обещание условно

1

Я использую автоматизированную систему тестирования, Транспортер.

Я пришел к выводу, что Protractor часто использует promises асинхронно разрешать оценку кода.

Вопрос: Как я могу вручную решить обещание определенного значения после выполнения условия?


Обновление: 09/08/2017

Извините, я был немного неясен по promises. Теперь я смог правильно работать с этим:

// match variable
var match = false;

// get all elements with 'div' tag
var scanElements = element.all(by.css('div')).each(function(el) {
    // get text content of element
    el.getText().then(function(text) {
        // split words into array based on (space) delimeter
        var sp = text.split(' ');
        for (var i = 0; i < sp.length; i++) {
            if (sp[i] == 'Stack Overflow') {
                match = true;
            }
        }
    });
});

// on complete
scanElements.then(function() {
    if (match) {
        console.log('Status: Found match!');
    }
    else {
        console.log('Status: No match');
    }
});
  • 0
    Я не использую транспортир, но я использовал BlueBird и Q. На этих платформах у вас есть возможность reject путем return deferred.reject(data) обещание и поймать статус с помощью .fail((data) =>) обработчик. Или вы также можете разрешить обещание с другими значениями, такими как deferred.resolve(myConditionalData1) ... или deferred.resolve(myConditionalData2) . Вы могли бы решить обещание несколькими способами, с несколькими значениями данных, просто нужно правильно обработать. Не добавляю это как ответ, потому что я не работал с платформой, которую вы используете. Надеюсь это поможет
Теги:
protractor

3 ответа

1

Вы должны использовать map вместо each. Если вы посмотрите на исходный код, то each них реализуется:

each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any> {
  return this.map(fn).then((): any => {
    return null;
  });
}

Таким образом, как вы можете видеть, он внутренне использует map и скрывает результат, возвращая null. Это также указано в документации.

Также переименовать element на что - то другое, только чтобы избежать неоднозначности с транспортиром element объекта.

1

Здесь нет проблемы в соответствии с документацией типа возвращаемого элемента element.all(). Each() является null после того, как он выполняет итерацию через все.

Обещание, которое будет разрешено, когда функция была вызвана для всех ElementFinders. Обещание решит null.

Изменить 1: Действительно ли фильтр является допустимым?

element.all(by.css('div'))
    .filter(function(element) {
       return element.getText().then(function(text) {
         var sp = text.split(' ');
         for ( var i =0; i< sp.length; i++) {
           if(sp[0] == 'protractor') return true;
         }
         return false;
       });
     }).first();

Сначала будет фильтровать и затем возвращать первый элемент, который соответствует

  • 0
    Я думаю, что я ищу: как мне остановить выполнение внешнего обещания и вернуть найденное значение, когда совпадение найдено?
0

В вашем точном примере вы можете использовать .getText() на ElementArrayFinder -

// calling .getText() exactly on ElementArrayFinder returns promise
let hasStackOverflow = $$('div').getText().then(texts=> {
    // texts would be array of strings
    return texts.includes('Your Text exact match')
})

hasStackOverflow.then(has=> {
    if (has) {
        console.log('Status: Found match!');
    }
    else {
        console.log('Status: No match');
    }
})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню