4 回答
TA贡献1812条经验 获得超5个赞
为了让您的承诺链从中获取价值_makeMove,您必须返回的结果_makeMove。不要担心价值是一个承诺;它将then在调用链中的下一个之前自动解析。
.catch(err => {
console.log('oops bad entry!')
return _makeMove(activePlayer);
// ^ return here
})
但是,_makeMove此处的结果将在 返回之前完成then,这可能会使您的recordMove调用返回两次。您可能需要拆分为_makeMove和_recordMove函数,以便递归调用_makeMove不会记录移动。
虽然理论上您可能会用完堆栈,但对于合理数量的移动尝试,它不会影响正确性。上面的两个错误会。
TA贡献1786条经验 获得超11个赞
我不确定你应该在这里使用递归调用。如果你得到一个非常垃圾的播放器,你可能会遇到 Stack Overflow 错误;)
const _makeMove = async (activePlayer) => {
let proposedMove = null;
while (1) {
proposedMove = await activePlayer.proposeMove();
if (gameBoard.checkLegal(proposedMove)) {
break;
}
}
activePlayer.recordMove(proposedMove);
// do more stuff
}
TA贡献1821条经验 获得超4个赞
我
.then
使用async/await
. 这解决了递归调用落到第 3 步而不是在第 2 步暂停的原始问题(我仍然觉得这很神奇......)然而,这产生了一个新问题。最初我将一个链接
.catch
到函数的末尾async
,但只触发了一次。即第 2、3、4 次递归调用会导致Unhandled exception
错误。所以我改为将所有代码放在try
函数内的一个块内,并将一个catch
块也放在函数内。这很好用
TA贡献1886条经验 获得超2个赞
const _makeMove = async (activePlayer) => {
try {
//Step 1 - take input
const proposedMove = await activePlayer.proposeMove();
//Step 2 - check if legal
if (!gameBoard.checkLegal(proposedMove)) {
throw new Error("bad entry");
}
//Step 3 - etc
//Step 4 - etc
//Step 5 - etc
} catch (e) {
console.log('oops bad entry!')
console.log("how it works: type 2 numbers ONLY, each between 1 and 3 (no spaces), to signify your move")
console.log("eg to place a mark into bottom left corner type 33. First cell = 11. Bang in the center = 22. You get it.")
console.log('lets try again...')
return _makeMove(activePlayer);
}
};
添加回答
举报