@slaaavyn

Как получить 2 ответа от сервера исользуя Promise?

По запросу с сервера возвращается 2 строки ответа по очереди, В коде получаю только одну!
const net = require("net");

const HOST = '192.168.0.75';
const PORT = '30001';

class Api {

    constructor(host, port) {
        this.HOST = host || HOST;
        this.PORT = port || PORT;
        this.socket = new net.Socket();

        this.init();
    }

    init() {
        const client = this;

        client.socket.connect(client.PORT, client.HOST, () => {
            console.log(`Client connected to: ${client.HOST}:${client.PORT}`);
        });

        client.socket.on('close', () => {
            console.log('FiscalAPI: connection closed');
        });
    };

    sendCommand(cmd) {
        const client = this;

        return new Promise((resolve, reject) => {
            if(cmd) {
                client.socket.write(cmd + '\u0000\r\n');
            }

            client.socket.on('data', (data) => {
                    resolve(data.toString());
            });

            client.socket.on('error', (error) => {
                reject(error);
            });
        });
    };

    checkPumpState(dispenser_index){
        this.sendCommand('0;open')
            .then((data) => {
                console.log(data);
                return this.sendCommand(`0;dispenser_get;${dispenser_index};1`);
            })
            .then((data) => {
                console.log(data);
                return this.sendCommand(`0;store_get;0;16\u0000\r\n`);
            })
            .then((data) => {
                console.log(data);
            })
            .catch((error) => console.log(error));
    }
}


по каждому запросу возвращается 2 ответа. Первый: echo запроса, второй: нужный для продолжения результат.
Этим кодом удается получить только первый ответ - echo. Как получить и второй тоже?

P.S.
Еще важный момент: ЗАПРОСЫ-ОТВЕТЫ должны идти в строгой последовательности, ответ на предыдущий запрос может использоваться как данные для следующего
  • Вопрос задан
  • 205 просмотров
Решения вопроса 1
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Я не очень понимаю что тут происходит, но предположу что у вас событие client.socket.on('data') вызывается два раза — для каждого ответа от сервера. А промис вы возвращаете сразу как получили первый ответ.

UPD принимаете все данные, но возвращаете только по событию 'end'

sendCommand(cmd) {
    if(cmd) {
      this.socket.write(cmd + '\u0000\r\n');
    }
    
      return new Promise((resolve, reject) => {
        const chunks = [];
        
        const handleData = chunk => {
          chunks.push(chunk);
        };

        const handleError = err => {
          reject(err);
        };

        const handleEnd => {
          const data = Buffer.concat(chunks).toString().match(/.*?\r\n/g);
          resolve(data);
        }

        this.socket.on('data', handleData);
        this.socket.on('error', handleError);
        this.socket.on('end', handleEnd);
      });
  }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
sendCommand при каждом вызове создает подписчика, что-то мне подсказывает, что твой сервер течет по памяти
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы