承诺:异步掷骰子



我试图转换此代码:

function rollDie() {
var random = prngInt()
var dieVal = (random % 6) + 1
var reroll = random > 251
if (reroll) {
return rollDie()
} else {
return dieVal
}
}

使用promise实现异步函数。当我尝试调整这个if-else语句时,问题就来了,但我对JavaScript和异步编程还不熟悉。我已经开始这样做了(我将使用的Promise函数(:

function getPseudoRandomInt() {
function promiseBehaviour(resolve, reject) {
setTimeout(() => resolve(prngInt()), 1000)
}
return new Promise(promiseBehaviour);
}

在那之后,我试着直接翻译/改编,但没有成功。

我的尝试:

function rollDieAsync() {
var random = getPseudoRandomInt()
var dieVal = random.then(x => (x % 6) + 1)
var reroll = random.then(x => x) > 251
if (reroll) {
return rollDieAsync()
} else {
return dieVal
}
}
}

这个函数正在工作,但不是我想要的方式,因为若语句不会执行,因为重新滚动promise不会得到评估。

我想得到一些帮助,但用最简单的方法。

应该是这样的:

function rollDieAsync() {
return getPseudoRandomInt()
.then(random => {
var dieVal = (random % 6) + 1
var reroll = random > 251
if(reroll){
return rollDieAsync()
}else{
return dieVal
}
})
}

最简单的方法是使用async/await语法:

async function rollDie() {
var random = await getPseudoRandomInt();
var dieVal = random % 6 + 1;
var reroll = random > 251;
if (reroll) {
return await rollDie();
} else {
return dieVal;
}
}

异步方法rollDieAsync实际上是一个Promise。然后你可以这样使用它:

rollDieAsync().then((value)=>{ console.log(value)}

最新更新