Javascript 如何从内部函数解析外部异步函数

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

在用户回答对话框提示后,如何使用指示用户次要状态(true/false)的布尔值解析外部异步函数askIfUserIsAMinor?例如:

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();