async/await 与 firebase .on() 数据库监听器

Posted

技术标签:

【中文标题】async/await 与 firebase .on() 数据库监听器【英文标题】:async/await with firebase .on() database listener 【发布时间】: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 没有。 如果你想在答案中提出这个问题,我会支持你!这完美地回答了我的问题,并给了我一个“当然”的时刻。 谢谢。我得到了同样的“当然”时刻,然后是自己的脸。 【参考方案1】:

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

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

【讨论】:

以上是关于async/await 与 firebase .on() 数据库监听器的主要内容,如果未能解决你的问题,请参考以下文章

使用 async / await 在 firebase 中运行查询

处理 Async Await 以使用 Firebase 和 react native

使用 useEffect() Hook 和 Async/Await 从 Firebase/Firestore 获取数据

在 Firebase Cloud Functions 中使用 async/await 时返回一个 Promise

Firebase:Flutter:避免事务崩溃 CloudFirestorePlugin.java:613 : .then() vs async/await

使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise <pending> 而不是已完成