【问题标题】:Promise value not getting returned but if I do console.log() it prints the value未返回承诺值,但如果我执行 console.log() 它会打印该值
【发布时间】:2018-03-24 20:58:42
【问题描述】:

这是我的函数,它返回一个包含按钮文本值的承诺

getToggleViewButtonText(){
        return this.toggleBasicOrAdvancedView.getText()
    }

现在,我又写了一个函数,它接受其他函数作为参数,解析 promise 并返回它的值。

promiseResolve(func){
    return func.then(value=>{
         return value
    });

问题是当我使用它时

promiseResolve(this.getToggleViewButtonText())

我得到了承诺,而不是按钮元素的文本值。但是,如果我在 promiseResolve 函数中执行 console.log(value)。我可以看到价值就在那里。可以帮助我在这里出错的地方。

【问题讨论】:

  • “我得到的是承诺,而不是返回的文本值” - 你为什么期望有什么不同?承诺的全部意义在于它包装了 asynchronous 行为,因此您必须在回调中访问已解析的值。
  • 为什么需要使用Promisethis.toggleBasicOrAdvancedView.getText() 返回什么?
  • @jonrsharpe 我的问题是,如果控制台.log(value) 我看到打印了正确的值,我认为这意味着承诺在那时得到了解决。但是,如果我确实返回值,然后像promiseResolve(this.getToggleViewButtonText()) 那样在外部使用它,我就不会得到值回来。是什么原因?
  • @guest271314 这会返回一个承诺,当它被解析时会给出一个按钮元素的文本值。

标签: javascript promise protractor es6-promise


【解决方案1】:

Promise.then() 返回承诺本身。承诺的重点是你不知道它什么时候会解决。所以你只能使用异步方法得到它的结果。

this.getToggleViewButtonText().then(value => {
    // Do something with the value here
});

【讨论】:

  • 我不想在这里解决承诺。并希望通过将其作为参数传递来在第二个函数中解决它。
  • 你不能强迫它解决。调用this.getToggleViewButtonText() 的代码必须适合处理异步性质。
【解决方案2】:

如果要求在下一行的代码中获取Promise 的值,您可以使用async/await

function getToggleViewButtonText() {
  return Promise.resolve(1)
}


async function promiseResolve(func) {
  let value = await func;
  if (value > 1) {
    return value
  } else {
    return value + " is not greater than 1"
  }
}

promiseResolve(getToggleViewButtonText()).then(data => console.log(data))

【讨论】:

  • 结果相同,promiseResolve 正在返回一个承诺
  • @ChrisPhillips 不确定您的意思?请参阅 OP 对询问的澄清 “我正在考虑在 if 语句中直接使用 promiseResolve(this.getToggleViewButtonText()) 来比较值,但作为它的返回承诺” stackoverflow.com/questions/46717787/…
  • 我相信他们想要一个函数promiseResolve,它不是异步的,只是返回值。您的promiseResolve 版本仍在返回一个promise,(通过异步语法创建的那个)
  • @ChrisPhillips let value = await func;value 设置为 Promise 的结果值
  • 是的,这是真的,但您示例中的最后一行仍在使用承诺。所以调用promiseResolve 的外部代码仍然需要处理一个promise。也许如果他们向我们展示他们想如何使用promiseResolve 的示例,我们可以更好地形成我们的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2018-03-06
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2016-10-11
相关资源
最近更新 更多