【问题标题】:async/await is always returning undefinedasync/await 总是返回 undefined
【发布时间】:2019-06-27 08:53:53
【问题描述】:

在我的量角器应用程序中,我有以下方法,它应该返回 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。

【问题讨论】:

  • 你为什么要这么做.then((isExist)=>{isExist;});,你想达到什么目的?避免awaiting a .then(…) chain!
  • 是的,但你仍然应该做简单的const isExist = await element(by.xpath(entery)).isPresent(); if (isExist) return Number(await element(by.xpath(entery)).getText()); else return 0;。
  • 如果您有新问题,请提出新问题,但不要将您原来的问题改成其他问题。这使得所有其他厌倦了解决您的原始问题的答案都错了。

标签: javascript typescript ecmascript-6 promise


【解决方案1】:

注意这一点:

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

在 JavaScript 胖箭头函数中,如果你用大括号括住你的代码,那么你需要返回一个值:

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

相反,如果您只有一行,则可以同时删除大括号和return 语句:

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

因此,在您的情况下,您也可以决定是在 isExist 之前添加 return,还是删除大括号。

但我们再进一步,如果你只有一个参数,你也可以去掉圆括号:

const square = x => x * x;

所以你的代码应该是这样的:

.then(isExist => isExist);

但这并不意味着什么!你只是返回你输入的参数,它不会改变你的承诺值。

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

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

附言。最好在 javascript 中讨论 fat-arrow 函数,而不是 lambda!

【讨论】:

  • 您的最后一个示例正在等待isPresent,这不是异步的。你需要括号。
  • 就是叫箭头函数。如果您来自 coffescript 的上下文,您可能会称它为胖箭头。但 ECMA 脚本规范将它们命名为 arrow function。
  • @t.niese 是的,但是当它被引入时,每个人都称之为“胖箭头函数”,也许是为了永远记住它的形状!
【解决方案2】:

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;

但仍不清楚您在等待什么。

【讨论】:

  • 你不要使用 await 然后一起。你只是再次等待。
  • Your code is returning before the then is even executed. OP 显示的代码中应该是这种情况吗? await 等待链式表达式返回的承诺(所以最后一个 .then 返回的那个)
【解决方案3】:

你不会从你的箭头函数返回任何东西,所以它的结果是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。

【讨论】:

  • @KamyarParastesh 你最初的问题是关于async/await is always returning undefined 和你提到的那个错误的机器人,这是一个完全不同的话题。
  • 您能再看看我的问题吗? @t.niese 抱歉,我暂时删除了已接受的答案,以便我可以从更多人那里获得帮助。我为它申请。
猜你喜欢
  • 2017-09-11
  • 2019-05-30
  • 2021-11-27
  • 2019-04-22
相关资源
最近更新 更多