【问题标题】:async/await with firebase .on() database listenerasync/await 与 firebase .on() 数据库监听器
【发布时间】:2017-12-02 13:05:54
【问题描述】:

我正在设计一个消息应用程序,使用 redux 作为我的状态管理器和 firebase 来存储我的数据。我已经开始以这种方式编写我的数据库侦听器:

const fetchMessages = roomKey => async dispatch => {
  const db = firebase.database();
  let { messages } = await db.ref(`messages/${roomKey}`).on('value');
dispatch({
  type: SET_MESSAGES,
  payload: messages,
})

};

这基本上就是通过房间键获取消息,然后发送一个将消息设置为 redux 状态的操作。

传统上,这会这样写:

db.ref(`messages/${roomKey}`).on('value', snapshot => {
  const messages = snapshot.messages;
  dispatch({
    type: SET_MESSAGES,
    payload: messages,
  })
});

每当messages/${roomKey} 发生变化时,我的调度函数就会被执行。我想知道使用 async await 语法是否可以同样工作,如果没有,我该如何让它工作。

希望这是足够的细节!

【问题讨论】:

  • on 不返回承诺。 once 有,但on 没有。
  • 如果你想在答案中提出这个问题,我会支持你!这完美地回答了我的问题,并给了我一个“当然”的时刻。
  • 谢谢。我得到了同样的“当然”时刻,然后是自己的脸。

标签: firebase firebase-realtime-database redux async-await react-redux


【解决方案1】:

引用的on method 不返回承诺。它传递的回调可以被多次调用,所以一个promise不符合方法的契约。

但是,引用的once method 方法确实返回了一个promise,因为它传递的(可选)回调只被调用了一次——在promise 解决之后。 once 方法可能是您想要使用的方法。

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多