Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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.then with.on(';value';)_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase.then with.on(';value';)

Javascript Firebase.then with.on(';value';),javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在尝试使.then()与.on()一起工作,但它只与.once()一起工作 我在(…)上获得了playersRef.on.。当使用on()尝试它时,它不是一个函数 所以我现在得到的是: let nodesRef = Firebase.database().ref('players') let answers = {} playersRef.on('value', (playersSnapshot) => { playersRef.once('value')

我正在尝试使
.then()
.on()
一起工作,但它只与
.once()
一起工作

我在(…)上获得了
playersRef.on.。当使用
on()尝试它时,它不是一个函数

所以我现在得到的是:

   let nodesRef = Firebase.database().ref('players')
   let answers = {}
   playersRef.on('value', (playersSnapshot) => {
      playersRef.once('value').then((playersSnapshot) => {
        playersSnapshot.forEach((playerSnapshot) => {
          let playerKey = playerSnapshot.key
          let answersRef = playerSnapshot.child('answers')
          if (answersRef .exists()){
            answers[playerKey ] = answersRef .val()
          }
        })
      }).then(() => {
        console.info(answers);
        dispatch(setPlayerAnswers(answers))
      })
    })
但我不喜欢它两次查询ref的事实

在本例中,我如何获得每个玩家的答案?什么是更正确的方法?因为我不认为这是Firebase开发者想要的方式

有什么理由不为
.on()
实现它?因为
playersSnapshot.forEach(…)。那么
也不是一个函数。。。当
.on('value')
触发时,我如何只执行一次

我不能完全确定你问题的某些部分,所以我只能回答我能回答的部分

对于
.on()
,没有实现[
then()
]的原因是什么

我们在Firebase JavaScript客户端中实现了对承诺的支持。承诺的定义是它只能解决(或失败)一次。由于Firebase
on()
方法可以多次接收更新的数据,因此它不符合承诺的定义

如何在触发
.on('value')
时只执行一次

如果只想对事件响应一次,则应使用
one()
方法

我不确定您为什么在使用
forEach()
时遇到问题。以下方面应起作用:

playersRef.on('value', (playersSnapshot) => {
   playersSnapshot.forEach((playerSnapshot) => {
      let playerKey = playerSnapshot.key
      let answersRef = playerSnapshot.child('answers')
      if (answersRef .exists()){
        answers[playerKey ] = answersRef .val()
      }
   })
})
如果您在执行此操作时遇到问题,能否在jsbin中重现该问题?

firebaser

我不能完全确定你问题的某些部分,所以我只能回答我能回答的部分

对于
.on()
,没有实现[
then()
]的原因是什么

我们在Firebase JavaScript客户端中实现了对承诺的支持。承诺的定义是它只能解决(或失败)一次。由于Firebase
on()
方法可以多次接收更新的数据,因此它不符合承诺的定义

如何在触发
.on('value')
时只执行一次

如果只想对事件响应一次,则应使用
one()
方法

我不确定您为什么在使用
forEach()
时遇到问题。以下方面应起作用:

playersRef.on('value', (playersSnapshot) => {
   playersSnapshot.forEach((playerSnapshot) => {
      let playerKey = playerSnapshot.key
      let answersRef = playerSnapshot.child('answers')
      if (answersRef .exists()){
        answers[playerKey ] = answersRef .val()
      }
   })
})

如果您在执行此操作时遇到问题,是否可以在jsbin中重现该问题?

当我尝试
时。然后
forEach
之后,我得到错误:
layersSnapshot.forEach(…)。then不是一个函数
是的,这是因为您处理
then()
两次:一次在代码段的第4行,另一次在第12行。承诺是可链接的,但前提是您从第一个
then()
处理程序返回另一个承诺。当我尝试
。然后
forEach
之后,我得到错误:
layersSnapshot.forEach(…)。then不是一个函数
是的,这是因为您处理
then()
两次:一次在代码段的第4行,然后再次在第12行。承诺是可链接的,但前提是您从第一个
then()
处理程序返回另一个承诺。