У меня есть многопользовательская карточная игра, где клиент играет в раунд.Функция для воспроизведения этого раунда, скажем, playRound
возвращает Promise
, если раунд был успешно сыгран или что-то пошло не так, например, клиент попытался обмануть.
Теперь я хочу пойматьсобытие из EventEmitter
, если клиент ошибается или неожиданно уходит.Поскольку было бы неплохо повторно использовать обработчик catch обещания отклоненного игрового раунда, я подумал о том, чтобы обещать событие, а затем просто выполнить Promise.race()
с функцией playRound
, только если событие происходит и если Promise
все ещев ожидании он должен отклонить.
Мой код, который сильно упрощен и должен помочь понять проблему, выглядит следующим образом:
// function only rejects if on error handler gets called and it never resolves
// underscore param should indicate that the resolve function is never used
const onClientError = client => new Promise((_, reject) => {
const handler = () => {
reject(Error(`client encountered an error`));
};
client.api.onError(handler);
});
try {
const round = await Promise.race([
playRound(client),
onClientError(client),
]);
// check for unexpected behaviour
if (!round) {
throw Error('played round is undefined');
}
// return the result
return round;
} catch (error) {
// do something if rejected or on client error
}
По моему мнению, не должно быть проблем с его использованиемно у меня есть ощущение, что есть лучший способ решить эту проблему.Но состояние всегда должно быть действительным, потому что round
либо выбрасывает, либо определено.
Мой вопрос сейчас, это плохая практика - делать что-то подобное (обещание, которое никогда не разрешается в сочетании с расой обещаний)или вы знаете лучший способ решить эту проблему?