2015-12-24 110 views
1

如何解决外部异步函数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 
} 

是的,还有很多其他的方法来解决这个问题,而异步/ AWAIT,但我的使用情况比这要复杂得多,这只是一个简单的场景。在ES6中,这可以通过使askIfUserIsAMinor返回一个承诺并使内部onPress函数在外部承诺上调用resolve来解决。

+0

使用了'await'错误......我会一直期望看到'回报伺机dialog.prompt(...' - 虽然,不知道wh在对话框或dialog.prompt代码甚至看起来像,很难说 –

+0

我已经扩大了评论 –

+0

可以说对话框就像一个库方法,显示提示,并在按下时调用每个按钮的附加功能。我们不能修改dialog.prompt到一个'await''''异步函数'。 –

回答

2

此代码实际上正常工作 - promisify dialog.prompt,然后你等待在async function 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 
    } 
} 

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

它工作吗?说实话,我猜根据我有限的ES2016/ES7阅读 - 仍然追赶ES2015/ES6 –

+0

理论上它应该。现在进行测试。只是有点恼火,ES7异步/等待应该被用作对ES6承诺的改进,但是当更复杂的情况出现时,我们必须回到承诺。 –

+0

@GeoffreyGoh - 编辑答案 - 上面应该可以工作,但也许不是你想要的 –

相关问题