@Kneepy

Как возвращать promise в socket io?

Есть некоторое событие которое принимает backend и там уже делает запросы к бд и т.п, т.к эти изменения должен увидеть только один пользователь, а не все, то есть callback в который прилетают данные, но эти изменения не успевают записываться во vuex из-за чего не отображаются, так вот вопрос, как сделать так чтобы результат события являлся асинхронным и возвращал promise, возможно callback придётся убрать не спорю, но новое событие для приёма данных не рассматриваю
// client
socket.emit('event',  /*передаём данные*/ (callback) => /*обрабатываем данные*/)

//server
socket.on('event',  (body, callback) =>  /*вызываем функцию и передаём туда параметры и т.п, именно тут нужно вернуть promise клиенту */ )
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Если я правильно понял, то нужно чтобы клиент мог с помощью сокета сделать запрос и дождаться ответа. Обычно схема такая: клиент придумывает некий уникальный id, сохраняет свой колбэк в некую карту
mapCallbacks[id] = (data) => {...}
id передается серверу вместе с другими параметрами запроса.
сервер, получив данные, отсылает их вместе с этим id
клиент, поймав такое сообщение, берет из него id и вызывает mapCallbacks[id](response), после чего удаляет mapCallbacks[id]

чтобы вернуть именно промис, можно сделать так:
return new Promise((resp, rej) => {
  mapCallbacks[id] = (error, data) => {
    if (error) {
      rej(error);
    } else {
      resp(data);
    }
  };
});


либо, как вариант, внутри промиса сделать mapCallbacks[id] = {resp, rej} и в обработчике сообщения вызвать нужное
Ответ написан
Ваш ответ на вопрос

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

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