#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, которая не показана в вопросе или ответе. В нынешнем виде этот ответ вводит в заблуждение, потому что изменение этих функций на функции со стрелками ничего не исправляет.