Javascript 如何从内部函数解析外部异步函数
在用户回答对话框提示后,如何使用指示用户次要状态(true/false)的布尔值解析外部异步函数askIfUserIsAMinor?例如:Javascript 如何从内部函数解析外部异步函数,javascript,async-await,ecmascript-next,Javascript,Async Await,Ecmascript Next,在用户回答对话框提示后,如何使用指示用户次要状态(true/false)的布尔值解析外部异步函数askIfUserIsAMinor?例如: async function askIfUserIsAMinor() { let dialogButtons = [ { text: "Yes", onPress: () => { // I want to return 'false' on the outer async function
async function askIfUserIsAMinor() {
let dialogButtons = [
{
text: "Yes",
onPress: () => {
// I want to return 'false' on the outer async function
}
},
{
text: "No",
onPress: () => {
// I want to return 'true' on the outer async function
}
}
];
dialog.prompt("Are you above the age of 18?", dialogButtons);
}
let userIsAMinor = await askIfUserIsAMinor();
if (userIsAMinor) {
// let user proceed
} else {
// show something else
}
是的,在没有异步/等待的情况下,有许多其他方法可以解决这个问题,但是我的用例比这个复杂得多,这只是一个简化的场景。在ES6中,这可以通过让
askIfUserIsAMinor
返回一个承诺并让内部onPress
函数调用外部承诺上的resolve
来解决。此代码实际上工作正常-提示对话框,然后你等待着异步函数testMinor中的承诺——我之前发布的代码落入了其他人总是落入的陷阱,认为可以让异步代码同步
function askIfUserIsAMinor() {
return new Promise(function(resolve) {
let dialogButtons = [{
text: "Yes",
onPress: () => resolve(true)
}, {
text: "No",
onPress: () => resolve(false)
}];
dialog.prompt("Are you above the age of 18?", dialogButtons);
});
}
async function testMinor() {
let userIsAMinor = await askIfUserIsAMinor();
if (userIsAMinor) {
// let user proceed
} else {
// show something else
}
}
或
您使用的
wait
不正确。。。我希望看到return await dialog.prompt(…
-虽然,不知道什么是对话框或对话框。提示代码看起来像什么,但很难说我已经扩展了commentLets,比如说对话框就像一个显示提示的库方法,并在按下时调用每个按钮的附加函数。我们无法将dialog.prompt修改为等待
-可异步函数
。di是如何实现的通常使用alog.prompt?它是否返回承诺,或者是否有回调参数?换句话说,去掉async/await-dialog.prompt如何工作?完全基于回调,它不返回承诺,对每个按钮的回调都附加到onPress
。它工作吗?老实说,我根据我有限的回复猜测ES2016/ES7的升级-理论上仍在赶超ES2015/ES6。现在就开始测试。只是有点恼火ES7 async/await被认为是对ES6承诺的改进,但每当出现更复杂的场景时,我们就不得不退回到承诺上来。@GeoffreyGoh-编辑了答案-上面的内容应该有效,但是你不完全像你想要的那样
async function askIfUserIsAMinor() {
let userIsAMinor = await new Promise(function(resolve) {
let dialogButtons = [{
text: "Yes",
onPress: () => resolve(true)
}, {
text: "No",
onPress: () => resolve(false)
}];
dialog.prompt("Are you above the age of 18?", dialogButtons);
});
if (userIsAMinor) {
// let user proceed
} else {
// show something else
}
}
askIfUserIsAMinor();