【问题标题】:Firebase .then with .on('value')Firebase .then 与 .on('value')
【发布时间】:2016-11-03 12:57:46
【问题描述】:

我正在尝试让 .then().on() 一起使用,但它仅适用于 .once()

当我尝试使用on() 时,我得到了playersRef.on(...).then is not a function

所以我现在拥有的是:

   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 的事实。

在此示例中,我将如何获得each 玩家的答案?什么是更正确的方式?因为我认为这不是 Firebase 开发人员的本意。

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

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    firebaser 在这里

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

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

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

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

    当您只想对事件响应一次时,您应该使用once() 方法。

    我不确定您为什么在使用 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 之后尝试.then 时出现错误:layersSnapshot.forEach(...).then is not a function
    • 是的,那是因为您处理了两次then():一次在 sn-p 的第 4 行,然后在第 12 行再次。Promise 是可链接的,但前提是您从第一个返回另一个 Promise then() 处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2016-09-26
    相关资源
    最近更新 更多