【发布时间】: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