Обещать шаблон на основе событий - PullRequest
1 голос
/ 20 сентября 2019

Как я могу обещать связь на основе событий websocket, чтобы работать как ajax?

constructor(){
  this.ws = new WebSocket(...);
  this.ws.onmessage = (event) => {
    const data = JSON.parse(event.data);
    // send data to doRequest
  };

},

async function doRequest(data){
  this.ws.send(JSON.stringify(data));
  return new Promise((resolve, reject) => {
    // how to wait and get data?
    resolve(data);
  });
}

Я думал добавить свой собственный emmiter и событие fire в функцию onmessage, а затем подключить обещание от doRequest кэто событие, но кажется немного запутанным?

1 Ответ

2 голосов
/ 20 сентября 2019

Веб-сокеты могут получать и отправлять данные в обоих направлениях в любое время, тогда как обещания разрешаются только один раз с одним значением.Таким образом, обещания не могут быть правильным инструментом здесь.

Если, однако, вы хотите написать абстракцию вокруг ответа на один запрос , то Promise имеет смысл:

Добавить прослушиватель событий, который прослушивает message событие, но только прослушайте его один раз и удалите его, отправьте данные и разрешите каждый раз, когда было отправлено событие message.

Удалите function, как этоmethod класса, который вы создаете.

doRequest(data){
  return new Promise(resolve => {
    this.ws.addEventListener('message', event => {
      resolve(event.data);
    }, {once: true});
    this.ws.send(JSON.stringify(data));    
  });
}

В вашем конструкторе создайте только экземпляр WebSocket.

constructor(){
  this.ws = new WebSocket(...);
}

И затем используйте его следующим образом:

const socket = new YourWebSocketClass();
socket.doRequest({message: 'hello'}).then(message => {
  const data = JSON.parse(message);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...