我正在设计一个消息传递应用程序,其中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语法是否可以正常工作,如果没有,我怎么能让它工作。
希望这足够详细!
答案 0 :(得分:8)
引用的on
method不会返回承诺。它传递的回调可以多次调用,因此承诺不符合方法的契约。
但是,引用的once
method方法确实会返回一个promise,因为它传递的(可选)回调只被调用一次 - 之后promise就会解析。 once
方法可能是您要使用的方法。