Задать вопрос
@wintreist

Как правильно посылать и получать данные у WebSocket?

Пытаюсь написать TS\JS скрипт с использованием WebSocket, чтобы с сервером общаться, но я не пойму, как лучше всего, правильно, сделать отправку и получение данных.
Логика такая, что мне нужно отправить данные, дождаться ответа, вернуть ответ из метода и перейти дальше по коду.
С помощью ИИ и интернета сделал что-то такое:
sendMethod(method_name: string, data: any): Promise<any> {
        return new Promise((resolve, reject) => {
            let method = {
                method_name: method_name,
                data: data,
            };
    
            let messageHandler = (event:MessageEvent) => {
                // Обработка полученного результата
                this.socket.removeEventListener('message', messageHandler);
                let result = JSON.parse(event.data);
                resolve(result);
            };
            // Добавляем обработчик для получения результата
            this.socket.addEventListener('message', messageHandler);
    
            // Отправляем метод
            this.socket.send(JSON.stringify(method));
        });
    }

И уже сам метод:
get_info_about_video(video_uuid:string){
        let result = this.sendMethod(
            "get_info_about_video",
            {
                video_uuid: video_uuid,
            }
        ).then(result => {
            return result;
        });
        console.log(result)
        return result
    }

Но есть ощущение, что это не работает так как мне нужно.
Поэтому я спрашиваю тут, может кто-то знает, как лучше\правильно\чище реализовать такое?
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
Я сделал так: протокол взял json rpc:

let requestCounter = 0
let jsonRpcPromises = {}
function jsonrpc (method, params) {
  const dataToSend = { jsonrpc: '2.0', method, params, id: ++requestCounter }
  socket.send(JSON.stringify(dataToSend))
  return new Promise((resolve, reject) => {
    jsonRpcPromises[requestCounter] = { resolve, reject }
  })
}

function completeJsonrpc (message) {
  const { id, error, result } = message
  if (error !== undefined) {
    jsonRpcPromises[id]?.reject(error)
  } else {
    jsonRpcPromises[id]?.resolve(result)
  }
  delete (jsonRpcPromises[id])
}

//
    socket.onmessage = function (event) {
      const message = JSON.parse(event.data)
///
      if (message.jsonrpc) {
        completeJsonrpc(message)
      } else if (...) {
/// 
    }


Код выше намеренно упрощен, в нем нет обработок крайних случаев (типа обрыва связи, реконнекта с продолжением или без продолжения обработки, кривых id и т.п.)

сам протокол упрощен, нет пакетного режима, передача идет по одному сообщению, а не массивами (потому что с сокетом это не нужно)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы