У меня есть плеер, подключенный к каналу, и при успешном подключении он получает состояние от канала.
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 объект
но я также хочу установить тайм-аут соединения с клиентом на тот случай, если что-то пойдет не так, обещание не висит навсегда.