Ответ WebSocket как Promise с проблемой нескольких сообщений - PullRequest
0 голосов
/ 26 февраля 2019

Я использую angularjs для веб-сайта, где мне приходится загружать данные каждую секунду.Для этого я использую WebSocket, проблема в том, что я отправляю много разных запросов разных типов.Для разработки запроса я использую Promises, но иногда ответы получаются не на ту функцию.Позвольте мне привести пример:

Итак, у меня есть служба, которая делает запрос и получает результат как Promise.

socketService.$inject = [];
function socketService(){
    let service = this;

    let server = new WebSocket('ws://localhost:8090');
    let isOpen = false;

    server.onopen = function(){
        isOpen = true;
    };

    server.onerror = function(){
      //TODO handle error
    };

    service.sendRequest = function(action, data){
        return new Promise(function (resolve, reject) {

            if (isOpen) {
                server.send(encodeRequest(action, data));
                server.onmessage = function (message) {
                    resolve(JSON.parse(message.data));
                }
            }

            server.onopen = function () {
                server.send(encodeRequest(action, data));
                server.onmessage = function(message) {
                    resolve(JSON.parse(message.data));
                    isOpen = true;
                }
            };

            server.onerror = function (error) {
                reject(error);
            }
        })
    };

}

И я использую его так:

socketService.sendRequest('get_events', {})
  .then(function (response) {
      //DO SOMETHING WITH THE RESPONSE
      return socketService.sendRequest('get_history', {
          fromDate: value,
          toDate  : value,
          tag     : value,
          event   : value
      })
  })
  .then(function (response) {
      //DO SOMETHING WITH THE RESPONSE
  });

Проблема в том, что если я выполняю такие запросы (когда одно обещание разрешено, я вызываю другое, то оно отлично работает), но если вместо этого я выполняю, например, несколько запросов каждую секунду, а затем в то же время я делаю новоезапрос (socketService.sendRequest(...)) результаты запутались.

Я выяснил, что проблема в том, что, если я делаю запрос и перед тем, как получить результат первого запроса, я делаю другой, ответ первого запроса переходит ко второму.

Я не понимаю, почему это происходит, потому что я каждый раз возвращаю новое Обещание, поэтому он должен разрешить ответ этого Обещания вместо того, чтобы разрешать ответ следующего Обещания.

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

Может кто-нибудь объяснить мне, что происходит и как я мог это исправить?

1 Ответ

0 голосов
/ 26 февраля 2019

Вам нужно будет указать уникальный идентификатор в сообщениях, чтобы убедиться, что каждый ответ соотносится с правильным запросом.Но прежде чем углубиться в кодирование, вы можете взглянуть на json rpc 2.0.Это стандарт с парой различных реализаций javascript, который будет обрабатывать большую часть этого для вас.Мне повезло с https://github.com/jershell/simple-jsonrpc-js

Вы также спросили, почему ваш код Promise работает не так, как вы ожидаете.Ответ ... ну, Promise не работает так, как вы ожидаете.:-) Хорошо, позвольте мне быть более полезным.Ваш код Promise изменяет методы обратного вызова сервера (onOpen, onMessage и т. Д.), Чтобы они вызывали функцию обещания "решить".Проблема в том, что, хотя у вас есть несколько обещаний, у вас есть только один сервер.Поэтому каждое создаваемое вами обещание просто указывает методы обратного вызова сервера на новую функцию разрешения.

Но ... пропустите все это.Кто-то уже понял это для вас.Используйте JSON RPC 2.0.

Дункан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...