有人可以帮助我了解 async + await + useEffect 在 React 中的工作原理吗?

Can someone help me understand how async + await + useEffect work in React?

我有一个使用 Minimal 模板构建的 React 应用程序,我正在尝试按照他们的一个教程进行操作,以创建一个将一些数据提供给自定义组件的 Redux 切片。数据本身是从 Firebase 收集的。下面是我的代码:

firebase.js - 助手

export function getDocuments(col) {
    const colRef = collection(db, col);
    const q = query(colRef, where('uid', '==', auth.currentUser.uid));

    getDocs(q).then((snap) => {
        const data = snap.docs.map((d) => ({ id: d.id, ...d.data() }));
        return data;
    });
   // return [1,2,3]
}

product.js - Redux 切片

export function getProducts() {
    return async (dispatch) => {
        dispatch(slice.actions.startLoading());
        try {
            const products = await getDocuments('products');
            dispatch(slice.actions.getProductsSuccess(products));
        } catch (error) {
            dispatch(slice.actions.hasError(error));
        }
    };
}

ProductList.js - 组件

const dispatch = useDispatch();
const { products } = useSelector((state) => state.client);

useEffect(() => {
    dispatch(getProducts());
}, [dispatch]);

useEffect(() => {
    if (products.length) {
        // setTableData(products);
    }
}, [products]);

如果我在辅助函数 (firebase.js 中控制台记录 data,一旦承诺 [=41],我就会得到我期望的值=].但是,如果我 console.log clientsproduct.js 切片或组件中的稍后部分,我会得到 undefined。 我认为我的问题是无法理解 async + await + useEffect 如何协同工作以解决此问题。我的假设是我试图在承诺解决之前访问该值,因此在辅助函数 returns 之前访问它。我通过在辅助函数中返回一个简单的数组 [1, 2, 3] 作为测试来确认这一点。

我想我在这里遗漏了一些基本的东西(我对 React 和 JS 总体上不是很有经验,但仍在不断学习)。有人可以帮助我了解我做错了什么吗?

谢谢!

A​​syncA​​waitReact 中与在普通 JavaScript 中没有什么不同: 当应用 await 关键字时,它会挂起调用方法并将控制权交还给其调用者,直到等待的任务完成。 await 只能在异步方法中使用

useEffect(): 通过使用这个 Hook,你告诉 React 你的组件需要在渲染后做一些事情。每当组件 re-rendered.

时,此函数将 运行

使用 await 您可以等待承诺的履行或拒绝,但您的 getDocuments 函数没有 return 承诺。将函数的最后一行更改为以下内容:

return getDocs(q).then((snap) => {
    const data = snap.docs.map((d) => ({ id: d.id, ...d.data() }));
    return data;
});