解决并拒绝嵌套函数中异步函数的承诺

Resolve and reject promise from async function within nested function

鉴于我有以下功能:

async function foo() {
  document.getElementById('ok').addEventListener('click', () => {
    // How do I resolve from foo here?
  })
  document.getElementById('cancel').addEventListener('click', () => {
    // How do I reject from foo here?
  })
}

如评论所述,我如何在嵌套函数中解决或拒绝 foo 的承诺?

我目前的解决方案是:

function foo() {
  return new Promise((resolve, reject) => {
    document.getElementById('ok').addEventListener('click', () => {
      resolve()
    })
    document.getElementById('cancel').addEventListener('click', () => {
      reject()
    })
  })
}

但是有了这个,我必须自己 return Promise 而不是使用 async。有没有更好的方法?

编辑:我最初给出的例子并不是最好的。更新了我的问题和代码。

您可以 return 来自 foobar 的 return 值来解析承诺,或者从 bar 抛出以拒绝它:

async function foo() {
  const bar = () => {
    return 'Resolved'
    //or `throw 'Rejected'`
  }

  //Where you call `bar`:
  return bar()
}

foo().then(console.log) //Resolved

根据对问题所做的编辑进行编辑

您必须承诺所有异步操作,以便将它们与 async/await 一起使用。

因此,您将需要像您所做的那样做出承诺。然后,你可以用这个承诺做任何事情。

所以,你的方法是完全正确的(你唯一可以做的微不足道的优化就是避免创建额外的处理函数):

function foo() {
  return new Promise((resolve, reject) => {
    document.getElementById('ok').addEventListener('click', resolve)
    document.getElementById('cancel').addEventListener('click', reject)
  })
}