Выход из функции после разрешения обещания транспортира - PullRequest
0 голосов
/ 18 января 2020

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

  1. Проверить доступную вкладку на веб-странице.
  2. Проверить, виден ли элемент на веб-странице.
  3. а) Если да, return deffered.fullfil(true)
    б) Если нет, - Нажмите на вкладку In-Progress. - Нажмите на доступную вкладку. - Go к шагу 1.

Я пытаюсь сделать это рекурсивно, и ниже приведен мой код. Это печать Элемент найден, но никогда не выходит из функции после этого и истекает время ожидания.

var check_availability = function(counter, totalCount, element){
var deferred = potractor.promise.defer()
if(counter <= totalCount){
    browser.wait(function(){
        browser.wait(EC.visibilityOf(element),2000)
        return element
    }).then(function(success){
        console.log('Element found.')
        return deferred.fulfill(true)
    }, function(err){
       inprogressTab.click()
       .then(() => availableTab .click())
       .then(() => check_availability (counter+1 , totalCount, element))
    })
   } else{
   return deferred.reject(false)
  }
  return deferred.promise
}

PS: это пример кода, который я использую, исправлены некоторые орфографические ошибки и синтаксис.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Во-первых, в этом коде есть орфографические ошибки. «deferred» - с одним «f», поэтому вызов promise.deffer() выдаст ошибку времени выполнения. Это должно быть .defer(). Также rpotractor написано с ошибкой. Ваш код даже не может быть запущен.

Во-вторых, вы используете anitpattern: нет необходимости создавать обещание / отсрочку, когда вы уже получаете объект обещания из browser.wait. Просто верните это (или одно, возвращенное из цепочки then).

Кроме того, return element является неправильным возвращаемым значением. Он выполняется синхронно, поэтому до окончания ожидания цепочка then срабатывает слишком рано. Вместо этого обязательно верните обещание, которое browser.wait вернет.

Вы можете сделать что-то вроде этого:

var check_availibility = function(counter, totalCount, element){
    if (counter <= totalCount) {
        return browser.wait(function () {
            return browser.wait(EC.visibilityOf(element), 2000)
//          ^^^^^^
        }).then(function () {
            console.log('Element found.')
            return true;
        }).catch(function (err) {
            return inprogressTab.click()
//          ^^^^^^
                .then(() => availableTab.click())
                .then(() => check_availibility(counter+1 , totalCount, element))
        })
    } else {
        return protractor.promise.rejected(false);
    }
}

Обратите внимание, что JavaScript имеет собственное обещание поддержка начиная с EcmaScript2015, поэтому вместо использования protractor.promise, вы можете просто использовать Promise.

1 голос
/ 18 января 2020

Я вижу несколько синтаксических ошибок в вашем общем коде. Ниже я попытался исправить эти ошибки и предоставил ожидаемое поведение, но до сих пор не знаю, откуда исходит inprogressTab.

const check_availibility = function(counter, totalCount, element) {
  const deferred = protractor.promise.defer();
    if (counter <= totalCount) {
       browser
        .wait(() => browser.wait(EC.visibilityOf(element), 2000))
   .then(
    element => {
      console.log("Element found.");
      return deferred.fulfill(true);
    },
    err => {
      inprogressTab
        .click()
        .then(() => availableTab.click())
        .then(() => check_availibility(counter + 1, totalCount, element));
    }
  );
} else {
   return deferred.reject(false);
}
  return deferred.promise;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...