我有一个多人纸牌游戏,客户玩一轮。
如果轮次成功播放或出现问题(例如客户试图作弊),则此轮播放的功能会让playRound
返回Promise
。
我现在要做的是,如果客户端出错或意外离开,则从EventEmitter
捕获事件。因为重用被拒绝的游戏回合承诺的捕获处理程序会很好,我想要宣传该事件,然后只使用Promise.race()
函数执行playRound
,这样只有在事件发生时以及{ {1}}仍在等待它应该拒绝。
我的代码高度简化,应该只是帮助理解问题,如下所示:
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
}
抛出或被定义。
我现在的问题是,做这样的事情是不好的做法(承诺永远不会与承诺竞赛一起解决)或者你知道更好的方法来解决这个问题吗?