【问题标题】:node.js non-blocking POST request to wait for another POST requestnode.js 非阻塞 POST 请求等待另一个 POST 请求
【发布时间】:2015-11-22 11:57:30
【问题描述】:

所以我正在开发一个基于文本的游戏,用户将发布请求发送到用 node.js 编写的服务器。但是,我需要通过让第一个玩家在提交响应之前等待第二个玩家来匹配 2 个玩家。现在的问题是,在我调用一次发布请求后,我无法发送另一个发布请求以获得任何响应。似乎第一个线程正在阻止更多未来的请求。在使用回调和异步方面应该做什么。如果可能的话,我不想使用套接字,因为这会限制玩家可以编码的语言。

var newGame=0;
//joins new game (username,password)
app.post('/game/join', function(req, res) {
    var username = req.body.username;
    var password = req.body.password;
    if(newGame==1){
        res.send('Game Started');
        newGame=0;
    }
    else{
        newGame=1;
        wait(username, function(){
            res.send('Game Started'+username);
        });
    }
});

function wait(username){
    while(newGame==1){
        console.log(username + newGame);
    }
}

【问题讨论】:

    标签: javascript node.js multithreading post asynchronous


    【解决方案1】:

    因此,您可能已经发现,一旦您的等待功能启动,其他任何事情都不会发生。这是因为带有阻塞调用 (console.log) 的无限 while 循环会阻止事件循环在“完成”之前执行任何其他操作。您可以分别使用 setTimeout、setInterval 和 clearInterval 等待以在将来的某个时间运行函数、在间隔上运行函数以及在间隔上停止运行函数。

    var newGame = 0;
    
    app.post('/game/join', function(req, res) {
        var username = req.body.username;
        var password = req.body.password;
    
        if (newGame === 1) {
            res.send('Game started' + username);
        } else {
            var wait = setInterval(function() {
                if (newGame === 1){
                    clearInterval(wait);
                    res.send('Game Started');
                    newGame = 0;
                }
            }, 5000); // retry every 5 seconds
        }
    }
    

    });

    【讨论】:

      【解决方案2】:

      Node.js 是单线程的,因此您的代码会阻止服务器处理额外的请求。阻止事件循环是你不想做的事情。

      我打算使用 Socket.IO 或 WebRTC 之类的东西来请求,但我看到了你的限制。我不太清楚你所说的“限制玩家可以编码的语言”是什么意思

      【讨论】:

      • 谢谢!由于 node.js 是单线程的,我认为用 python 编写服务器对我来说更好。我对这些语言的抱怨是允许玩家通过发送 POST 和 GET 请求来玩游戏,我认为这不再可行。如果不是这样,我认为 python 更适合我对项目的需求。
      • @user5590696 你仍然可以使用 Node.js 来完成你的工作,顺便说一句,你只需要确保你的代码是异步的
      【解决方案3】:

      对我来说,不清楚如何选择 2 个用户开始比赛。如果是这样,一个玩家连接,另一个玩家加入,然后他们之间开始比赛,我会做这样的事情。

      var waitingResponses = [];
      //joins new game (username,password)
      app.post('/game/join', function(req, res) {
          var username = req.body.username;
          var password = req.body.password;
          if(pendingJoinRequests.length) {
            var waitingPlayerResponse = waitingResponses.shift();
            waitingPlayerResponse.send('Game Started'+username);
            res.send('Game Started');
          }
          else {
            waitingResponses.push(res);
          }
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 2013-11-12
        • 2013-12-22
        相关资源
        最近更新 更多