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條經驗 獲得超5個贊
我
.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);
}
};
添加回答
舉報