【问题标题】:Redux Thunk Firebase - fetch arraysRedux Thunk Firebase - 获取数组
【发布时间】:2017-09-26 21:17:47
【问题描述】:

我正在使用 redux、react-redux、redux-thunk 构建一个 react native 应用,并使用 firebase 作为后端。

我的数据库是非规范化的,所以我必须在 firebase 引用中获取键,并且对于每个键,我需要从另一个引用中获取数据。

使用 firebase .once('value') 我得到了这样的结果:

const fetchPosts = ( uid ) => {
    return ( dispatch ) => {

         dispatch(postsIsFetching())

         const userPostsRef = firebase.database().ref('users/' + uid + '/myposts')

         var keys = []
         //
         userPostsRef.once('value').then(snap => {

             snap.forEach(post => keys.push(post.key))

         }).then(() => {

         keys.forEach(key => {

             const postRef = firebase.database().ref('posts/' + key )

             postRef.once('value').then(snap => {
                 var newPost = {
                            title: snap.val().title,
                            user: snap.val().user
                            }
                 dispatch(setPost(newPost))
             })

        })

     }
}

但这不是实时更新,因为 .once() 方法只读取一次数据。 .on() 方法不返回 Promise,那么我该如何解决呢? 使用 redux-thunk 和非规范化的 firebase 数据库获取数据的最佳模式是什么?

谢谢大家

【问题讨论】:

    标签: firebase react-native react-redux redux-thunk


    【解决方案1】:

    将您通常放入.then() 的代码放入.on() 回调中。这样,每次数据刷新时,您的 setPost 操作都会被调度。

    例如:

    ...
    postRef.on('value', snap => {
        var newPost = {
            title: snap.val().title,
            user: snap.val().user
        }
        dispatch(setPost(newPost))
    });
    

    您可能希望保留该数据库引用,以便以后可以stop listening

    【讨论】:

    • 非常感谢 Jeff,但问题是我应该获取引用“user/myposts”中的帖子键,所以我应该在第一个 .once() 中更改一些内容。
    • 当然,类似的情况也适用。使用 .on('value', ...) 而不是 .once(),而不是使用 .then(),只需将函数作为第二个参数传递给 .on()
    • 好的,杰夫,再次感谢,现在帖子已获取,但发生了一些奇怪的事情。我单击 fab,导航器将我带到“添加帖子”视图。添加了新帖子我回到“我的帖子”视图,问题是:虽然我告诉 redux 清空“我的帖子”数组,但这还没有完成,除了旧帖子列表的元素之外,还有每个帖子(即使是新的)但加倍!例如,如果我有 5 个帖子并添加了一个,当我返回“我的帖子”列表时,有 17 个帖子,旧的 5 个和新的列表(有 6 个元素)重复一次,所以 12 个元素。跨度>
    • 现在我重写了 thunk 并且似乎正确获取了行程,更新了 redux 存储,但我的设备上没有发生任何事情。 “我的帖子”视图为空。
    • 查看这个答案:stackoverflow.com/a/32137978/4816918 除此之外,除非您共享一些代码/您的状态结构,否则我将无法诊断此问题。由于我们已经解决了最初的 Firebase 问题,这可能值得提出一个新的 StackOverflow 问题。
    猜你喜欢
    • 2018-04-12
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2020-06-18
    • 2020-10-28
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多