Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript firebase:获取TableReference的密钥_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript firebase:获取TableReference的密钥

Javascript firebase:获取TableReference的密钥,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用Firebase和Javascript。我需要获取由push()创建的引用的密钥 我的代码等待push返回的承诺,然后读取密钥。看起来是这样的: firebase.database().ref("preds/").push() .then(function(newReference){ console.log(newReference.key); }); 现在我正在看一段由同事编写的代码。它不使用承诺。相反,它直接使用键: var newReference = firebas

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

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

firebase.database().ref("preds/").push()
.then(function(newReference){
    console.log(newReference.key);
});
现在我正在看一段由同事编写的代码。它不使用承诺。相反,它直接使用键:

var newReference = firebase.database().ref("preds/").push()
console.log(newReference.key)
这看起来确实更好(特别是因为实际代码比这些示例长)。但我怀疑这可能是一种竞赛条件。如果我们仍在等待数据库的响应,而密钥已经被使用,该怎么办? 但是我不能用他的代码产生问题

我看了看消防基地,他们有点困惑。 它表示
push()
返回一个:

承诺与参照相结合;写入完成时解析,但可立即用作对子位置的引用

他们的示例如下所示:

firebase.database().ref("preds/").push()
.then(function(newReference){
    console.log(newReference.key);
});
这看起来类似于使用
newReference.key
,但没有一个是阻塞的。如果我理解正确,这些函数只是为了异步执行而链接起来的。 但是,他们确实表示可以立即使用该引用访问
子位置

我搜索了一下,发现了这个问题: Dan_Mindru说:

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

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

firebase
  .ref('item')
  .push({...})
  .then((snap) => {
     const key = snap.key 
  })
我知道这是围绕firebase的一个非常常见的问题,但我希望我提供了足够的上下文来证明我的困惑。 获取新创建引用的密钥的正确方法是什么?
我必须等待承诺还是可以直接访问密钥?

调用
push()
时生成的密钥是纯客户端操作。无参数调用
push()
时,不涉及对服务器的调用。因此,您共享的前两段代码是等效的

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


有关这些推送ID的更多信息,请参阅博文:。

太好了,谢谢。(我认为密钥可能需要与服务器进行通信。不一定是为了避免冲突,我知道这是不可能的。但为了确保正确的顺序。密钥是根据时间戳创建的,并按时间排序。因此,如果不进行同步,这一时间顺序不变量可能会被打破。但可能他们不会对此做出艰难的假设)当客户端建立其初始连接时,它将确定其与服务器时间的偏移量。这用于计算推送ID。偏移量也显示在
.info/serverTimeOffset
:。