第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

JavaScript:遞歸函數(shù)無法正確處理 Promise

JavaScript:遞歸函數(shù)無法正確處理 Promise

四季花海 2023-05-25 17:06:38
我正在用 Node.js 編寫一個(gè)簡單的游戲。玩家采取行動(dòng),這是作為承諾發(fā)出的。接下來檢查移動(dòng)的合法性:如果合法 - 很好,執(zhí)行下一個(gè)“.then”如果不是 - 遞歸調(diào)用相同的函數(shù)以獲得新的移動(dòng)什么有效:我設(shè)法使用“reject”+“catch”打破承諾鏈并遞歸調(diào)用該函數(shù)。什么不起作用:當(dāng)_makeMove第二次被調(diào)用時(shí),它應(yīng)該要求玩家采取新的行動(dòng),暫停直到他們回答。實(shí)際發(fā)生的是該函數(shù)只是運(yùn)行到第 3 步,而不是等待玩家的進(jìn)入。我正在通過終端輸入,窗口仍然在“請(qǐng)輸入:”,但代碼已經(jīng)跑掉了..(最終遇到“未定義”錯(cuò)誤,這是很自然的,因?yàn)橥婕疫€沒有機(jī)會(huì)輸入新的著法)。代碼(簡化):const _makeMove = (activePlayer) => {    //player makes a move, which is returned as a promise    activePlayer.proposeMove()      //Step 1 - check if legal      .then(proposedMove => {        if (!gameBoard.checkLegal(proposedMove)) {          return Promise.reject("bad entry");        }        return proposedMove;      })      //Step 2 - record the move      .then(proposedMove => {        activePlayer.recordMove(proposedMove);        return proposedMove;      }) //unless step 1 fails...      .catch(err => {        console.log('oops bad entry!')        //in which case let's ask the player to move again...        //by calling the function RECURSIVELY        _makeMove(activePlayer);      })      //Step 3 - game goes on...      .then(proposedMove => {        //more stuff      })  }我完全不解。為什么遞歸調(diào)用沒有按預(yù)期工作?
查看完整描述

4 回答

?
ABOUTYOU

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ì)。


查看完整回答
反對(duì) 回復(fù) 2023-05-25
?
Qyouu

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

}


查看完整回答
反對(duì) 回復(fù) 2023-05-25
?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

  1. .then使用async/await.?這解決了遞歸調(diào)用落到第 3 步而不是在第 2 步暫停的原始問題(我仍然覺得這很神奇......)

  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)。這很好用

查看完整回答
反對(duì) 回復(fù) 2023-05-25
?
MM們

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);

    }

  };


查看完整回答
反對(duì) 回復(fù) 2023-05-25
  • 4 回答
  • 0 關(guān)注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)