#javascript #node.js #tcp #promise #return-type
#javascript #node.js #tcp #обещание #возвращаемый тип
Вопрос:
Я пытаюсь достичь чего-то, что кажется невозможным в typescript из-за его асинхронной природы.
У меня в принципе есть сеть.Объект сокета для связи с сервером по протоколу TCP.
Вот чего я хотел бы достичь :
import * as net from 'net'
class TCPClient {
// The member used to communicate with the server
client: net.Socket;
[...]
/**
* Method called in another portion of code.
* In this method, I call client.write to send data to server.
* As first param, I put the command. As second param, a callback that is called when the
* data is sent.
* I listen then to the 'data' event to read the response from the server.
* I store the response into a variable. I return the variable.
* PROBLEM: Due to the asyncronous type of NodeJS, the variable appears as empty.
**/
command(cmd: string): string{
var res : string;
this.client.write(cmd, () => {
this.client.on('data', response => {
res = response.toString();
});
});
return res;
}
[...]
}
Комментарии:
1. вы не можете синхронно возвращать асинхронный результат ни на ОДНОМ языке (typescript не имеет асинхронной природы)
Ответ №1:
Вы должны создать асинхронный метод, используя Promises, что-то вроде:
command(cmd: string): Promise<string> {
return new Promise((resolve) => {
this.client.write(cmd, () => {
this.client.on('data', response => {
resolve(response.toString());
});
});
})
}
Но чтобы упростить задачу, вы можете использовать async/await в своем вызывающем коде.