2

ユーザーがダイアログ プロンプトに応答した後、外部の非同期関数 askIfUserIsAMinor をユーザーのマイナー ステータス (true/false) を示すブール値で解決するにはどうすればよいですか? 例えば:

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
}

はい、非同期/待機なしでこの問題を解決する方法は他にもたくさんありますが、私の使用例はこれよりもはるかに複雑です。これは単純化されたシナリオにすぎません。askIfUserIsAMinorES6 では、promise を返し、内側のonPress関数が外側の promise を呼び出すことで解決できますresolve

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 に答える