Обещание… Возвращать тип вместо обещания

#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 в своем вызывающем коде.