2

在用户回答对话框提示后,如何使用指示用户次要状态(真/假)的布尔值来解析外部异步函数 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
}

是的,有很多其他方法可以在没有 async/await 的情况下解决这个问题,但是我的用例比这要复杂得多,这只是一个简化的场景。在 ES6 中,这可以通过askIfUserIsAMinor返回一个 Promise 并让内部onPress函数调用resolve外部 Promise 来解决。

4

1 回答 1

3

这段代码实际上工作正常 - 承诺 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();
于 2015-12-24T03:13:33.800 回答