【问题标题】:2 stdin, One only once, The other many2个标准输入,一个只有一次,另一个很多
【发布时间】:2018-07-05 20:41:44
【问题描述】:

所以我需要在开始游戏之前先提示用户一些信息。游戏是第二个标准输入,然后它一直循环到游戏结束,要求输入,做它的事情等等,直到有人获胜。

我无法获得一次与连续工作:

先运行

process.openStdin().on('data', (name) => {

    if(firstRun){
      console.log("Please enter your first name");
      Computer.move();
      firstRun = false;
    }

    process.openStdin().on('data', (move) => {
      Human.move(move);
    });
});

问题是我注意到外部标准输入运行,得到一个 res,但随后它将它的 res 传递给我不想要的内部标准输入......

我确定我可能不会这样做,但我不知道还能尝试什么。

让我给你一些我尝试过的新代码

const play = async () => {
  await promptForName();
  await runGame();
}

function promptForName(){
  return new Promise((resolve, reject) => {

    console.log("enter a your name:")

    process.openStdin().on('data', (name) => {
      console.log(`symbol entered: ${name}`)

      process.stdin.removeListener("data", promptForName);
      resolve()
    });
  })
}

function runGame(){
  return new Promise((resolve, reject) => {
    process.openStdin().on('data', (move) => {
      console.log(`move: ${move}`)

      Human.move(move);
      resolve()
    });
  })
}

当我运行它时,第一次运行似乎正常,第二次运行但我没有得到 move 的值,也没有提示输入任何输入

【问题讨论】:

  • 我不认为你正在做你认为你正在做的事情。没有多个stdin 这样的东西。此外,您从哪里获得openStdin() 函数,它在node documentation 中没有记录?我看到的唯一参考是在这个问题中:Unknown method process.openStdin()
  • @zero298 奇怪的是,process.openStdin() 可以在没有任何包的情况下工作。
  • 对,我只尝试了标准输入,但它会爆炸,所以是的,openStdin 可以工作,并且在引擎盖下它只是在做一个标准的标准输入。 openStdn 记录在节点站点上,但我认为没有多少人知道这一点。

标签: javascript node.js


【解决方案1】:

只有 1 个stdin。您应该为其附加一个侦听器,然后在第一次移动后将其移除。

// Keep track of the computer listener
const computerListener = process.stdin.on("data", name => {
    console.log("Please enter your first name");
    Computer.move();

    // Remove it after the first time
    process.stdin.removeListener("data", computerListener);

    // Set up a new listener
    process.stdin.on("data", move => {
      Human.move(move);
    });
});

或者,您可以使用.once()

// Keep track of the computer listener
const computerListener = process.stdin.once("data", name => {
    console.log("Please enter your first name");
    Computer.move();

    // Set up a new listener
    process.stdin.on("data", move => {
      Human.move(move);
    });
});

【讨论】:

  • 我也在尝试异步/等待,但是当我在解析第一个标准输入时运行第二个标准输入,第二个不接受用户输入
  • 啊!也许我只需要删除第一个,谢谢会用我的 async/await 试试这个
  • 我也在用openStdn
  • @PositiveGuy 如果你想创建一个提示界面,你可能需要考虑readline.createInterface()
【解决方案2】:

您可以使用else

process.openStdin().on('data', (name) => {

    if(firstRun){
      console.log("Please enter your first name");
      Computer.move();
      firstRun = false;
    }else{ 
      Human.move(move);
    }

});

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2017-01-19
    • 2021-09-30
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2018-11-16
    • 2013-12-14
    相关资源
    最近更新 更多