簡體   English   中英

在js中的while循環中使用回調時如何停止無限循環

[英]how to stop infinite loop when using callback inside while-loop in js

所以我正在創建一個像 Connect 4 這樣的游戲,它要求用戶輸入但我面臨的問題是我在 while 循環中使用了 callback(readline.question) function 每當我啟動代碼時它就開始無限循環而不詢問一個用戶的問題。 我怎樣才能暫停一段時間直到用戶回答? 我必須在不使用async/await的情況下解決這個問題。

 function fetchColumn(player, callback) {
   io.question(`Player ${player}, which Column? `, line => {
        console.log(`You requested "${line}"`);
        chosen_column = line;
        callback(); 
    });
}
let connect4 = new Connect4();
connect4.makeBoard(numRows, numCols, winLength);
while (game_over == 0) {
    connect4.printBoard();
    fetchColumn(current_player,()=>{
    
        console.log(`you entered ${chosen_column}`);
        
        if (chosen_column != 'Q' && chosen_column != 'q') {
            move_status = connect4.place_piece(chosen_column, current_player);
            x_in_a_row_status = connect4.x_in_a_row(current_player);
            
            if (move_status == 0) {
// Further code-------

這就是我在終端中得到的。

Player 1, which Column? 
A B C D E F G 
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . 
Player 1, which Column? 
A B C D E F G
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .

----------Keep repeating----------

如果要在循環中調用異步 function,可以將whileawait結合使用:

function fetchColumnAsync(player) {
  return new Promise(function(resolve, reject) {
    io.question(`Player ${player}, which Column? `, line => {
      console.log(`You requested "${line}"`);
      chosen_column = line;
      resolve(); 
    });
  });
}
let connect4 = new Connect4();
connect4.makeBoard(numRows, numCols, winLength);
while (game_over == 0) {
  connect4.printBoard();
  await fetchColumnAsync(current_player);
  console.log(`you entered ${chosen_column}`);
  ...
}

或遞歸結合回調 function:

function loop() {
  if (game_over == 0) {
    connect4.printBoard();
    fetchColumn(current_player, () => {
      console.log(`you entered ${chosen_column}`);
      ...
      loop();
    });
  }
}
let connect4 = new Connect4();
connect4.makeBoard(numRows, numCols, winLength);
loop();

但是您不能將while與回調結合使用,因為while循環的第二次迭代同步開始,然后才能異步調用回調 function。 換句話說,它給出了一個無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM