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> 而不是已完成