解决并拒绝嵌套函数中异步函数的承诺
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 来自 foo
的 bar
的 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)
})
}
鉴于我有以下功能:
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 来自 foo
的 bar
的 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)
})
}