gpt4 book ai didi

javascript - Meteor中的心跳方法

转载 作者:行者123 更新时间:2023-11-28 06:06:46 25 4
gpt4 key购买 nike

我有一个 Meteor 应用程序,当用户按住按钮时,每一秒都会将帖子上的值减 1。有很多按钮,每个按钮都应该只影响其自身。

如果一个人按住按钮,它就会以每秒 1 的速度下降。如果两个人(在不同的客户端上)则每秒两个。

数据库中更新的确切时刻是不必要的,只是客户端应该看到计数器每秒减少一个可变的量。

因此为了触发我使用以下方法

Template.button.onRendered(function() {
var data = this.data;

Meteor.setInterval(function() {
if(isClicked) {
Meteor.call('heartbeat', data);
}
}, 1000);
});

调用客户端/服务器方法

'heartbeat': function(button) {
Buttons.update({_id: button._id}, {$inc: {life: -1}});

if(button.life <= 1) {
console.log('REMOVE DEAD BUTTONS');
Buttons.remove({life: {$lte: 0}});
}
}

当延迟发挥作用时,会导致奇怪的事件。当我点击一个按钮时,它的生命周期在我的客户端上会按预期下降 1hz。在不同的客户端上,它的生命周期可能会静止几秒钟,然后以 2 到 4 的 block 为单位减少,直到 catch 。它应该在从服务器收到更新后立即跳转到新值,而不是逐渐下降。

但是由于没有代码可以使其斜坡上升,所以我相信游戏中存在一些更根本的错误。按钮会经历三种状态:

Client A decrements value -> Server decrements value -> Client B reads value

问题似乎出现在客户端 A 和服务器之间,因此也许设置每秒调用一个方法的时间间隔是我需要修复的瓶颈,但我不确定是否有任何优雅的解决方案。如果我不发送每个更新,而是采用航位推算方法并发送开始和结束,并让服务器在中间的每一秒进行插值,这可能会缓解一些问题,但我不知道我是否会遇到沿着这条线还有更多意想不到的问题。

是否有一种明显更好的方法可以为每个客户端每秒被动地减少计数器?

最佳答案

另一种方法:

  1. 当用户按下按钮时(在模板事件处理程序中捕获此操作),向服务器发出 Meteor.call() 并使服务器每秒递减一次.
  2. 当用户释放按钮时,再次进行Meteor.call()来取消递减。您需要保留 setInterval 的句柄,以便可以取消它。

这样您就可以消除执行更新时客户端->服务器的延迟。

关于javascript - Meteor中的心跳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36784128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com