async / await всегда возвращает неопределенный - PullRequest
0 голосов
/ 03 февраля 2019

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

async getTheValueOfEntery(entery: string) {
  var value = await element(by.xpath(entery))
    .isPresent().then((isExist) => {
      isExist;
    });
  return value;
}

Но проблема в том, что он всегда возвращаетсяundefined, хотя я уверен, он должен вернуть true.

Итак, что не так в моем методе?


Обновление:

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

async getTheValueOfEntery(entery: string) {

  var value = await element(by.xpath(entery))
    .isPresent().then((isExist, entery: string) => {
      isExist ? element(by.xpath(entery)).getText() : 0;
    });

  return value;
}

Но я не могу передать entery:string второй лямбде.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Возвращение от await действительно является параметром then.Вам не нужно then вообще.Результат then - это то, что возвращает undefined.

var value = await (element(by.xpath(entery))).isPresent()
return value;

Кроме того, я не уверен, что здесь асинхронно.Возможно, вы ожидаете не тот объект.

var value = await (element(by.xpath(entery))).isPresent()
return value;

или

var ele = await element(by.xpath(entery))
return ele.isPresent()

или

var ele = await by.xpath(entery)
return element(ele).isPresent()

обновлено

var isExist = await element(by.xpath(entery))
        .isPresent()
var value = isExist ? await element(by.xpath(entery)).getText() : 0;
        });

      return value;

Это все еще неясно, что вы ждете, хотя.

0 голосов
/ 03 февраля 2019

Вы ничего не возвращаете из функции стрелок, поэтому результат равен undefined.Если вы напишите:

.isPresent().then((isExist, entery: string) => {
  isExist ? element(by.xpath(entery)).getText() : 0;
});

, то это будет, как если бы вы написали:

.isPresent().then(function (isExist, entery: string) {
  isExist ? element(by.xpath(entery)).getText() : 0;
});

Поэтому вам нужно добавить return:

.isPresent().then((isExist, entery: string) => {
  return isExist ? element(by.xpath(entery)).getText() : 0;
});

Или удалите {}:

.isPresent().then((isExist, entery: string) => isExist ? element(by.xpath(entery)).getText() : 0);

И если вы ничего не делаете с переменной value, кроме ее возврата, то вам не нужно использовать await.Вы могли бы просто написать:

async getTheValueOfEntery(entery: string) {

  return element(by.xpath(entery))
    .isPresent().then((isExist, entery: string) => {
      isExist ? element(by.xpath(entery)).getText() : 0;
    });
}

В таком случае async теоретически также не требуется, но это не вредит, и это покажет, что эта функция всегда будет возвращать Promise.

0 голосов
/ 03 февраля 2019

Обратите внимание на это:

then((isExist)=>{isExist;});

В функциях жирной стрелки JavaScript, если вы заключаете код в фигурные скобки, вам нужно вернуть значение:

const sum = (a, b) => {
  return a + b;
}

Вместо этого, если у вас есть только строка, вы можете оставить как фигурные скобки, так и оператор return:

const sum = (a, b) = a + b;

Так что и в вашем случае вы можете решить, следует ли добавить return перед isExist,или если убрать фигурные скобки.

Но давайте пойдем дальше, если у вас есть только параметр, вы также можете опустить круглые скобки:

const square = x => x * x;

Так ваш код будет выглядеть следующим образом:

.then (isExist => isExist);

Но это мало что значит!Вы просто возвращаете параметр, полученный при вводе, и он не изменит значение вашего обещания.

В конце вы можете упростить код следующим образом:

async getTheValueOfEntery(entery:string){
    return (await element(by.xpath(entery))).isPresent();
}

Ps.Лучше говорить о функциях жирной стрелки в javascript, а не о лямбде!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...