【发布时间】:2019-08-09 11:30:39
【问题描述】:
我有一个 Angular 6 奇怪的问题。
我正在使用 setTimeout 和 clearTimeout 函数来启动/取消超时。 但是,这有时有效,有时无效。 即使用户触发了(点击)事件并运行了 clearTimeout,有时它也会强制玩家抓两张牌。
这里是代码
//an event that says we must call uno
this._hubService.mustCallUno.subscribe(() => {
this.mustCallUno = true;
this._interval = window.setInterval(() => {
this.countdown -= 100;
}, 100);
this._timer = window.setTimeout(() => {
if (this.mustCallUno) {
this.drawCard(2);
this.callUno();
}
}, 2000);
});
// a function player calls from UI to call uno and not draw 2 cards
callUno() {
this.mustCallUno = false;
window.clearTimeout(this._timer);
window.clearInterval(this._interval);
this.countdown = 2000;
}
所以即使玩家调用 callUno() 函数,setTimeout 也会被执行。更糟糕的是,代码会在 setTimeout if( this.mustCallUno) 内进行第一次 if 检查,这无论如何都应该是 false,因为我们只是在调用 callUno() 函数 this.mustCallUno = false; 时将其设置为 false。
我在 window.setTimeout 之前使用了 setTimeout(返回 NodeJS.Timer),结果是一样的。
【问题讨论】:
-
请问你为什么不使用 rxjs observables ?
-
@Florian 我对这个 Angular 和 rxjs 的世界有点陌生。你能用 observable 发布解决方案并将我链接到一些有用的“入门”页面吗?非常感谢
-
能否分享完整代码!我真的不明白你打算在这里做什么
-
@tonymarkoc ok。我将向您展示带有 rxjs 解决方案和文档页面的 stackblitz。
-
@Aravind 其余的代码真的不相关。我们通过 websocket 得到一个玩家必须调用 uno 的事件(我在上面写的第一个函数 - 订阅),然后用户有 2 秒时间按下 UI 中的 UNO 按钮,该按钮将调用应该清除超时的
callUno()函数,这样玩家就不会抽 2 张牌。
标签: javascript angular typescript angular6