You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义Hook获取Firebase Storage图片URL异常求助

解决Firebase Storage获取图片URL时返回Promise对象的问题

你的问题核心是**Promise.all没有正确等待getDownloadURL的Promise完成**——因为你往promises数组里塞的是包含Promise的对象,而非Promise本身。Promise.all只会处理数组中的Promise元素,不会自动解析对象内部的Promise属性。

修改后的代码如下:

import { getStorage, ref, listAll, getDownloadURL } from "firebase/storage";
import { useState, useEffect } from "react";

export const useLogos = () => {
  const storage = getStorage();
  const listRef = ref(storage, "images/logos");
  const [logoList, setLogoList] = useState([]);

  useEffect(() => {
    listAll(listRef)
      .then((res) => {
        // 把每个itemRef转换成一个Promise,resolve后得到包含name和URL的对象
        const promises = res.items.map((itemRef) => 
          getDownloadURL(itemRef).then(url => ({
            name: itemRef.name,
            logoURL: url
          }))
        );
        return Promise.all(promises);
      })
      .then((urlArray) => {
        setLogoList(urlArray);
      })
      .catch(err => {
        // 添加错误处理,捕获存储操作的异常
        console.error("获取Logo列表失败:", err);
      });
  }, []);

  return { logoList };
};

关键修改点:

  • 用map直接生成Promise数组:每个itemRef对应一个Promise,这个Promise会先等待getDownloadURL完成,再返回包含文件名和解析后URL的对象
  • Promise.all现在等待的是真正的Promise数组,所有Promise完成后,返回的就是包含完整数据的对象数组,此时logoURL已经是解析后的字符串
  • 新增了错误捕获,避免因存储操作失败导致的未处理Promise异常

内容的提问来源于stack exchange,提问作者Jbop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:20:39