异步/等待总是返回未定义

时间:2019-02-03 11:06:30

标签: javascript typescript ecmascript-6 promise

在我的量角器应用程序中,我具有以下方法,该方法应返回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传递给第二个lambda。

3 个答案:

答案 0 :(得分:1)

请注意以下事项:

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);

但这并不意味着什么!您只是返回输入中得到的参数,它不会更改您的promise值。

最后,您可以通过以下方式简化代码:

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

Ps。最好是用javascript而不是lambda来讨论fat-arrow函数!

答案 1 :(得分:1)

您没有从箭头函数返回任何内容,因此其结果为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。

答案 2 :(得分:-1)

await返回的值实际上是then参数。您根本不需要thenthen的结果就是返回的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;

虽然还不清楚您在等什么。