【问题标题】:awaited promise not waiting for resolve() before contuining在继续之前等待的承诺不等待 resolve()
【发布时间】:2020-10-01 07:00:47
【问题描述】:

我正在 node.js 中制作一个非常简单的游戏。在我的 TCP 客户端中,我有一个返回承诺的异步函数,当套接字接收到信息然后关闭时,承诺会解决。我的问题是:当我等待函数时,程序在解决以下示例之前继续运行:

async GetPlayers(player) {
    return new Promise(resolve =>{
        var net = require('net');
        const client  = new net.Socket();
    
        client.connect({
          port:this.port,
          host:this.IpAdress
        });
        
        client.on('error',function(error){
            console.log('Error : ' + error);
          });
          
        client.on('connect',function(){
        client.write("sendPlayersToMePls: "+ JSON.stringify(player)+"\n");
          var address = client.address();
          var port = address.port;
          var family = address.family;
          var ipaddr = address.address;
          
        });
        client.on('data',function(data){
            //
            var data2 = data.toString();
            if(data2.startsWith("hereAreYourPlayers: ")){
            if(Config.Verbose)console.log("data = "+data2);
            var players2 = data2.slice(20);
            var obj = JSON.parse(players2);
            that.FileSystem.allPlayers = obj.players;
            that.FileSystem.TickCount= parseInt(obj.turnCount);
            resolve(obj);
            client.end();
        }

    });
}

//to call it i am using the following
async UpdateMapStatuses(player){
        
        this.SetCurrentMap();
        const players = await GetPlayers(player);
        return new Promise(resolve => {
        //the program starts exectuing this before "players" has been defined
        //code that uses "players"
        }

}

【问题讨论】:

  • UpdateMapStatuses() 函数已经返回了一个承诺 - 为什么你要返回一个承诺的承诺?
  • console.log("data = "+data2) 输出什么?假设它输出任何东西
  • @JaromandaX 这是有道理的,但返回这个承诺是没有意义的。等待执行并返回结果会更有意义。但正如你所指出的 - 我们不知道意图是什么。
  • 这是一个想法……代码看起来不对……不应该是async function GetPlayers(player) {async function UpdateMapStatuses(player){ - 就像写的那样,这段代码甚至不会解析吗?
  • 感谢您的 cmets,您帮助我诊断了问题,我确实解决了您所说的低效代码。感谢您的帮助

标签: javascript node.js tcpclient


【解决方案1】:

尝试将您的 client.on 回调转换为箭头函数,看看是否有帮助。例如:

async GetPlayers(player) {
    return new Promise((resolve) =>{
        var net = require('net');
        const client  = new net.Socket();
    
        client.connect({
          port:this.port,
          host:this.IpAdress
        });
        
        client.on('error', (error) => {
            console.log('Error : ' + error);
          });
          
        client.on('connect', () => {
          client.write("sendPlayersToMePls: "+ JSON.stringify(player)+"\n");
          var address = client.address();
          var port = address.port;
          var family = address.family;
          var ipaddr = address.address;
          
        });
        client.on('data', (data) => {
            //
            var data2 = data.toString();
            if(data2.startsWith("hereAreYourPlayers: ")){
            if(Config.Verbose)console.log("data = "+data2);
            var players2 = data2.slice(20);
            var obj = JSON.parse(players2);
            that.FileSystem.allPlayers = obj.players;
            that.FileSystem.TickCount= parseInt(obj.turnCount);
            resolve(obj);
            client.end();
        }

【讨论】:

  • 嘿,只是想澄清一下,将函数更改为箭头函数确实解决了这个问题,但是代码中的另一个地方有相同的问题,我忘记更改了,因此产生了相同的错误,我没有注意到它从哪里发射已经改变了。感谢您的帮助,我已将您的回答标记为已接受。
  • @AuthoredEntropy - 将这些特定函数更改为箭头函数在我看来并不会产生任何影响。在这些箭头函数中没有使用this,因此它们将以一种或另一种方式执行相同的操作。 OP提到的问题或答案中未显示的其他功能可能就是这种情况。就目前而言,这个答案非常具有误导性,因为将这些函数更改为箭头函数并不能解决任何问题。
猜你喜欢
  • 2017-07-31
  • 2018-12-14
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多