4 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
為了讓您的承諾鏈從中獲取價(jià)值_makeMove,您必須返回的結(jié)果_makeMove。不要擔(dān)心價(jià)值是一個(gè)承諾;它將then在調(diào)用鏈中的下一個(gè)之前自動(dòng)解析。
.catch(err => {
console.log('oops bad entry!')
return _makeMove(activePlayer);
// ^ return here
})
但是,_makeMove此處的結(jié)果將在 返回之前完成then,這可能會(huì)使您的recordMove調(diào)用返回兩次。您可能需要拆分為_makeMove和_recordMove函數(shù),以便遞歸調(diào)用_makeMove不會(huì)記錄移動(dòng)。
雖然理論上您可能會(huì)用完堆棧,但對(duì)于合理數(shù)量的移動(dòng)嘗試,它不會(huì)影響正確性。上面的兩個(gè)錯(cuò)誤會(huì)。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
我不確定你應(yīng)該在這里使用遞歸調(diào)用。如果你得到一個(gè)非常垃圾的播放器,你可能會(huì)遇到 Stack Overflow 錯(cuò)誤;)
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貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
我
.then
使用async/await
.?這解決了遞歸調(diào)用落到第 3 步而不是在第 2 步暫停的原始問題(我仍然覺得這很神奇......)然而,這產(chǎn)生了一個(gè)新問題。最初我將一個(gè)鏈接
.catch
到函數(shù)的末尾async
,但只觸發(fā)了一次。即第 2、3、4 次遞歸調(diào)用會(huì)導(dǎo)致Unhandled exception
錯(cuò)誤。所以我改為將所有代碼放在try
函數(shù)內(nèi)的一個(gè)塊內(nèi),并將一個(gè)catch
塊也放在函數(shù)內(nèi)。這很好用

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
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);
}
};
添加回答
舉報(bào)