Javascript 节点应用程序通过暂停当前执行以交互方式从react前端获取用户输入

Javascript 节点应用程序通过暂停当前执行以交互方式从react前端获取用户输入,javascript,node.js,reactjs,express,node-modules,Javascript,Node.js,Reactjs,Express,Node Modules,我将一个用python编写的旧游戏转换为javascript(node)。游戏只是在一个while循环中运行,直到完成一定数量的迭代 runUntil(steps = 100000) { var x = 0; while (x < steps) { this.conversation(); x++; } } 在某些情况下,游戏会暂停以获取用户输入,这是必需的,并且会影响游戏的结果。在我的javascript实现中,我使用readline sync暂停游戏,并通过命令提示符获取用户

我将一个用python编写的旧游戏转换为javascript(node)。游戏只是在一个while循环中运行,直到完成一定数量的迭代

runUntil(steps = 100000) {
var x = 0;
while (x < steps) {
  this.conversation();
  x++;
}
}

在某些情况下,游戏会暂停以获取用户输入,这是必需的,并且会影响游戏的结果。在我的javascript实现中,我使用readline sync暂停游戏,并通过命令提示符获取用户输入。现在,我构建了一个react前端应用程序,以便在带有UI的浏览器中为游戏提供服务,我还使用express构建了一个服务器来处理API,并在用户按下start时运行游戏

const express = require("express");
const http = require("http");
const socketIO = require("socket.io");
const Game = require("./Game");
const port = 4000;
const app = express();
const server = http.createServer(app);
//Create socket usin server instance
const io = socketIO(server);

io.on("connection", socket => {

  console.log("user connected!");
  socket.on("startGame", data => {
    const nI = data.nI;
    const pI = data.pI;
    const noOfAgents = 20;
    const noOfPlayers = 1;

    const g = new Game(nI, pI, noOfAgents, noOfPlayers);
    g.runUntil(1000);
    });

  socket.on("disconnect", () => console.log("user has disconnected"));
});




server.listen(port, () => console.log("Listenint on port " + port));

然而,我目前还停留在这一点上。我不知道如何暂停游戏以从前端获取数据并相应地使用它。到目前为止,我所有的尝试都没有成功。我尝试使用Promissions,但没有帮助,因为它没有暂停游戏流程以等待用户输入

有一个名为Node的方便包(我确信围绕承诺组织的传统循环构造也有其他类似的类比。假设您有如下顺序同步代码(其中fn是一个简单的同步函数):

…将此改写为

  var promiseDoWhilst = require('promise-do-whilst')
  var condition = true;
  function fn() { // for example
    condition = Math.random() > 0.5; // flip a coin
    return new Promise(function(r, j){
      setTimeout(function(){ r(); }, 1000);
    }); 
  }
  promiseDoWhilst(function() {
    return fn(); with fn converted to a promise-returning function
  }, function() {
    return condition === true;
  })
如果有两个并行线程需要等待才能在循环中“取得进展”,则可以让它们都发生在返回承诺的函数中,将所有返回的承诺放入数组
arr
,然后让fn
return Promise.all(arr)
.A
。然后在
承诺后执行
功能。所有
接收保留位置顺序的数组中原始承诺的解析值。希望这有帮助!

我不确定如何暂停游戏以从前端获取数据并相应地使用它。-你不能,也不应该。同步循环是一个大错误首先,从发布的代码来看,游戏整体上应该如何工作还不清楚,但肯定不应该有这样的循环。它只是浪费CPU周期。如果游戏是基于时间的,你可以使用
async..wait
循环,以相对较小的延迟(100ms)作为滴答声。但同样,这取决于游戏应该如何运行。
  do {
    fn();
  } while( condition === true)
  var promiseDoWhilst = require('promise-do-whilst')
  var condition = true;
  function fn() { // for example
    condition = Math.random() > 0.5; // flip a coin
    return new Promise(function(r, j){
      setTimeout(function(){ r(); }, 1000);
    }); 
  }
  promiseDoWhilst(function() {
    return fn(); with fn converted to a promise-returning function
  }, function() {
    return condition === true;
  })