未捕获的类型错误:无法添加属性0,对象不可扩展||使用Firestore、Redux、创建异步Thunk

6fe3ivhb  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(140)

当我试图通过onSnapshot()订阅firestore上的实时更新时,我收到了这个错误,在redux react工具的createAsyncThunk的异步函数中使用它。
该函数不等待forEach完成。我已经尝试了for of循环,但不适用于onSnapshot。
这是我的createAsyncFunction。

export const getAuctions = createAsyncThunk(
    'auctions/getAuctions',
    async () => {
        const auctionRef = collection(db, "auctions");
        const fetched = [];
        onSnapshot(auctionRef, (querySnapshot) => {
            for (const doc of querySnapshot.docs) {
                fetched.push(doc.data());
            };
        })
        return fetched
    }
)

这是在应用程序加载时从useEffect内部的dispatch()调用的。有什么想法吗?!
谢谢你

brgchamk

brgchamk1#

这里有三个问题:

  • onSnapshot在这个异步thunk返回之后运行long,而不是在thunk返回期间运行long。因此,你实际上是在“now”返回一个空数组,里面没有任何数据。
  • onSnapshot * 确实 * 运行时,它试图改变fetched数组......但是该数组引用已经被添加到Redux状态并被Immer冻结。因此,JS引擎会抛出错误,因为你不能改变冻结的数组。
  • 最重要的是,onSnapshot显然可以运行 * 多次 *,而thunk只运行 * 一次 *(每次调度它时)。

我不熟悉Firebase的API,但您应该尝试使用“现在”返回数据的东西,沿着(伪代码):const data = await collection(db, "auctions").get()

相关问题