Что было бы более элегантным способом написать функцию асинхронного соединения низкого уровня - PullRequest
0 голосов
/ 08 января 2019

У меня есть плеер, подключенный к каналу, и при успешном подключении он получает состояние от канала.

this.clientConnectedCallbacks.add(uid, (state) => {
  if (this.clientConnectedCallbacks.has(uid)) {
    this.clientConnectedCallbacks.remove(uid);
    clearTimeout(this.clientConnectedTimeouts.get(uid));
    this.clientConnectedTimeouts.remove(uid);
    return state;
  }
  throw new Error('Client connection callback was no longer in the map.')
});

this.clientConnectedTimeouts.add(uid, setTimeout(() => {
  this.clientConnectedCallbacks.remove(uid);
  this.clientConnectedTimeouts.remove(uid);
  throw new Error(`Client ${uid} connection request to ${this.channelId} timed out`);
}, this.clientTimeout));

Я использую await / async всякий раз, когда могу, и функция, которая находится внутри, имеет тег async, но это реализация очень низкого уровня, и мне нужно вручную заставить функцию возвращаться асинхронно. Мне было интересно, есть ли еще какие-нибудь изящные идеи / дизайн, чтобы структурировать что-то вроде этого?

Я хочу вернуть состояние из подключенного канала асинхронно клиенту после того, как мы получим успешное сообщение о соединении от канала (это происходит в совершенно другой функции, которая сделана специально для обработки сообщений, но имеет доступ к this.clientConnectedCallbacks объект

но я также хочу установить тайм-аут соединения с клиентом на тот случай, если что-то пойдет не так, обещание не висит навсегда.

...