ожидаемое обещание, не ожидающее resolve() перед завершением

#javascript #node.js #tcpclient

#javascript #node.js #tcpclient

Вопрос:

Я создаю довольно простую игру внутри 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"
        }

}
  

Комментарии:

1. UpdateMapStatuses() функция уже возвращает обещание — почему вы возвращаете обещание обещания?

2. что console.log("data = " data2) выводит? предполагая, что оно выводит что-либо

3. @JaromandaX это имеет смысл, но не имеет смысла возвращать это обещание. было бы разумнее дождаться этого выполнения и вернуть результат. Но, как вы указываете, мы понятия не имеем, в чем заключается цель.

4. Вот мысль … код выглядит неправильно … разве это не должно быть async function GetPlayers(player) { и async function UpdateMapStatuses(player){ — как написано, этот код даже не будет анализировать, не так ли?

5. Спасибо за ваши комментарии, вы помогли мне диагностировать проблему, я исправил неэффективный код, о котором вы говорили. спасибо за помощь

Ответ №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();
        }
  

Комментарии:

1. Эй, просто хотел уточнить, изменение функций на функции со стрелками решило эту проблему, но в коде было другое место, в котором была та же проблема, которую я забыл изменить, что привело к той же ошибке, и я не заметил, откуда она была запущена, изменилась. Спасибо за вашу помощь, я пометил ваш ответ как принятый.

2. @AuthoredEntropy — изменение этих конкретных функций на функции со стрелками, на мой взгляд, не имеет никакого значения. this В этих функциях со стрелками не используется, поэтому они будут выполнять то же самое так или иначе. Возможно, это имело место в другой функции, о которой упоминает OP, которая не показана в вопросе или ответе. В нынешнем виде этот ответ вводит в заблуждение, потому что изменение этих функций на функции со стрелками ничего не исправляет.