【问题标题】:firebase: get key of ThenableReferencefirebase:获取 ThenableReference 的密钥
【发布时间】:2019-03-01 02:19:18
【问题描述】:

我正在使用 Firebase 和 Javascript。我需要获取由push() 创建的引用的密钥。

我的代码等待推送返回的承诺,然后读取密钥。它看起来像这样:

firebase.database().ref("preds/").push()
.then(function(newReference){
    console.log(newReference.key);
});

现在我正在查看一位同事编写的一段代码。它不使用承诺。相反,它直接使用密钥:

var newReference = firebase.database().ref("preds/").push()
console.log(newReference.key)

这看起来确实好多了(特别是因为实际代码比这些示例要长)。但我怀疑这可能是一种竞争条件。如果我们仍在等待数据库的响应并且密钥已被使用怎么办? 但我无法用他的代码产生问题。

我查看了 Firebase docs,它们有点令人困惑。 它说push() 返回一个:

结合了承诺和参考;写入完成时解析,但可以立即用作对子位置的引用。

他们的例子是这样的:

var messageListRef = firebase.database().ref('message_list');
var newMessageRef = messageListRef.push();
newMessageRef.set({
  'user_id': 'ada',
  'text': 'The Analytical Engine weaves algebraical patterns just as the Jacquard loom weaves flowers and leaves.'
});

这看起来类似于newReference.key 的使用,但没有一个是阻塞的。如果我理解正确,这些函数只是为了异步执行而链接起来的。 但是,他们确实说可以立即使用该引用来访问child location

我搜索了一下,发现了这个问题:In Firebase when using push() How do I pull the unique ID Dan_Mindru 说:

对于发现此问题并使用 Firebase 3+ 的任何人,您的方式 推送后自动生成的对象唯一 ID 是使用密钥 承诺快照上的属性(不是方法)

他的代码看起来就像我的初始版本:

firebase
  .ref('item')
  .push({...})
  .then((snap) => {
     const key = snap.key 
  })

我知道这是关于 firebase 的一个非常常见的问题,但我希望我已经提供了足够的上下文来证明我的困惑是正确的。 获取新创建参考的密钥的正确方法是什么? 我必须等待承诺还是可以直接访问密钥?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    调用push()时生成的密钥是纯客户端操作。当您在没有参数的情况下调用 push() 时,不涉及对服务器的调用。所以你分享的前两个sn-ps代码是等价的。

    在您的最后一个代码 sn-p 中,push({...}) 确实 调用服务器以将对象写入数据库。但是这里的新子节点的密钥也是在客户端代码中生成的。

    有关这些推送 ID 的更多信息,请参阅博文:The 2^120 Ways to Ensure Unique Identifiers

    【讨论】:

    • 太好了,谢谢。 (我认为密钥可能需要与服务器通信。不一定要避免冲突,我知道它们不太可能发生。但要确保正确的顺序。密钥是从时间戳创建并按时间排序的。所以没有一些同步这个不变量时间顺序可能会被打破。但也许他们不会对此做出严格的假设)
    • 当客户端建立它的初始连接时,它会确定它相对于服务器时间的偏移量。这用于计算推送 ID。偏移量也暴露在.info/serverTimeOffset:firebase.google.com/docs/database/web/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2018-03-26
    • 2017-09-15
    • 2019-01-26
    相关资源
    最近更新 更多