javascript - 在 react 中使用异步等待从火力存储中检索图像

标签 javascript reactjs react-hooks firebase-storage use-effect

我有一个 useEffect 钩子(Hook),里面有两个函数,第一个函数 (fetchImages) 获取存储在 firebase 存储中的所有用户图像。

第二个 (loadImages) 等待 fetchImages 并将图像设置为状态数组。问题是图像数组返回空,除非您转到不同的页面并返回……然后该数组将充满图像 url。

我不确定我的 useEffect Hook 或我的 async await 放置是否有问题,或者其他问题。对 currentUser 的 if 检查是因为 currentUser 在第一次加载时返回 null。

const [images, setImages] = useState([]); // All user images from storage
useEffect(() => {
    if (currentUser) {
        const fetchImages = async () => {
            setLoading(true)
            const result = await storage.ref(`images/${currentUser.id}`).listAll();
            console.log(result)
            const urlPromises = result.items.map((imageRef) =>
                imageRef.getDownloadURL()
            );
            console.log(urlPromises)
            return Promise.all(urlPromises);
        };

        const loadImages = async () => {
            const images = await fetchImages();
            setImages(images);
            setLoading(false);
        };
        loadImages();
    }
    console.log(loading)
}, []);
console.log(images, image)

currentUser 用户上下文文件

export const UserContextProvider = ({ children }) => {
    const [currentUser, setUser] = useState(null);
    // const [currentUser, setUser] = useState('');
    
    useEffect(() => {
        let unsubscribeFromAuth = null;
        unsubscribeFromAuth = auth.onAuthStateChanged(async userAuth => {
            if (userAuth) {
                const userRef = await createUserProfileDocument(userAuth);

                userRef.onSnapshot(snapShot => {
                    setUser({
                        id: snapShot.id,
                        ...snapShot.data()
                    });
                });
            } else {
                setUser(null)
            }
        });

        return () => {
            unsubscribeFromAuth();
        };
    }, [])
    // console.log(unsubscribeFromAuth)

    const toggleUser = () => {
        auth.signOut()
            .then(() => {
                window.localStorage.clear();
            })
            .then(() => {
                setUser(null)
            })
            .catch(e => console.log('There was a error:'(e)))
    }

最佳答案

currentUser 添加到 useEffect Hook 的依赖项数组。当 currentUser 状态更新时,您希望副作用是获取相关图像或清除它们。

const [images, setImages] = useState([]); // All user images from storage

useEffect(() => {
  if (currentUser) {
    const fetchImages = async () => {
      const result = await storage.ref(`images/${currentUser.id}`).listAll();
      const urlPromises = result.items.map((imageRef) =>
        imageRef.getDownloadURL()
      );
      return Promise.all(urlPromises);
    };

    const loadImages = async () => {
      setLoading(true);
      try {
        const images = await fetchImages();
        setImages(images);
      } catch(error) {
        // handle error, log it, show message, etc...
      }
      setLoading(false);
    };
    loadImages();
  } else {
    setImages([]);
  }
}, [currentUser]);

关于javascript - 在 react 中使用异步等待从火力存储中检索图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70267825/

相关文章:

javascript - jQuery 将多个事件绑定(bind)到一个选择器

javascript - 在React/Flux中处理计时器

javascript - 销毁具有多个返回值的 Custom React Hooks 的更好方法?

javascript - 第一个更新第二个依赖项的相关 useEffects 会导致奇怪的行为

javascript - 从后端获取谷歌地图的数据

javascript - 在 jQuery 中准确定位 <div>

javascript - AngularJS 的 ng-table 重新加载不起作用

javascript - 容器内的固定 div

performance - 如何使用 redux + Normalizr 减少渲染

node.js - 与Go API集成的React Frontend不同端口问题