Можно ли использовать Promise.race для перехвата, например, сообщения об ошибке во время ожидания разрешения / отклонения Promise? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть многопользовательская карточная игра, где клиент играет в раунд.Функция для воспроизведения этого раунда, скажем, 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 либо выбрасывает, либо определено.

Мой вопрос сейчас, это плохая практика - делать что-то подобное (обещание, которое никогда не разрешается в сочетании с расой обещаний)или вы знаете лучший способ решить эту проблему?

...