gpt4 book ai didi

javascript - Firebase.ServerValue.TIMESTAMP 未在监听器和实际添加数据的客户端之间同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:43:42 25 4
gpt4 key购买 nike

这是最简单的例子:

var fb = new Firebase('https://xxxxxxxxxxx.firebaseio.com/test');

fb.limitToLast(1).on('child_added', function(snap) {
console.log('key', snap.key());
console.log('val', snap.val());
});

fb.push({
date_now: Firebase.ServerValue.TIMESTAMP
});

如果我使用此脚本打开两个选项卡,实际推送数据的选项卡会在 child_added 回调中获得本地 时间戳,而另一个只是监听的选项卡会获得正确的服务器生成的时间戳。据我了解,这样做是为了排除往返并节省带宽。

但对于我的任务来说,这种行为是 Not Acceptable 。我该如何克服它?

这是来自 pusher 的 console.log:

key -K59mrvEUhTaoNIQQoA4
val Object {date_now: 1449732570832}

和监听器(等于仪表板中看到的服务器数据):

key -K59mrvEUhTaoNIQQoA4
val Object {date_now: 1449732571759}

最佳答案

Firebase 为该写入操作触发两个本地事件:

  1. 它会立即触发带有本地时间戳的 child_added 事件(已根据您对服务器的预期偏移进行更正)
  2. 稍后它会触发一个 child_changed 事件,其中包含服务器指定的实际时间戳。

所以你可以通过监听这两个事件来解决问题:

var fb = new Firebase('https://xxxxxxxxxxx.firebaseio.com/test');

var query = fb.limitToLast(1);
query.on('child_added', function(snap) {
console.log('key', snap.key());
console.log('val', snap.val());
});
query.on('child_changed', function(snap) {
console.log('key', snap.key());
console.log('val', snap.val());
});

fb.push({
date_now: Firebase.ServerValue.TIMESTAMP
});

通常建议处理所有 child_* 事件,而不仅仅是 child_added。服务器必须更新或删除该值以纠正本地事件的原因可能有更多。

如果您更喜欢使用单个回调/事件处理程序,您还可以监听 value 事件:

var query = fb.limitToLast(1);
query.on('value', function(snap) {
snap.forEach(function(child) {
console.log('key', child.key());
console.log('val', child.val());
});
});

您会注意到在回调中使用了 forEach()

关于javascript - Firebase.ServerValue.TIMESTAMP 未在监听器和实际添加数据的客户端之间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34196263/

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