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

React调用Firebase RTDB封装方法返回undefined问题求助

问题根源

你的FirebaseService异步函数没有显式返回Firebase请求的处理结果,所以外部调用时拿到的默认返回值就是undefined。你在.then()里的return formattedResponse只是返回给了Promise链本身,没有作为整个FirebaseService函数的返回值传递出去。

修复步骤

1. 修正FirebaseService的返回逻辑

同时补充空数据兼容,避免Firebase返回空值时forEach调用报错:

import {db} from './firebase'
const formatMarketData = (data) =>{
  let formattedData = [];
  // 先判断data是否存在再遍历
  data && data.forEach(item=>{
    const formattedItem = {
        ...item
    }
    formattedData.push(formattedItem);
  });
  return formattedData;
}
export const FirebaseService = async (id) => {
  id=id.replace(/['"]+/g, "");
  const historyKey="/coins/0/"+id
  // 这里加return把Promise的处理结果返回出去
  return await db.ref(historyKey)
    .once('value')
    .then(snapshot => {
      const data = snapshot.val();
      const formattedResponse= formatMarketData(data);
      console.log(formattedResponse)
      return formattedResponse
    });
};

2. 补充useEffect依赖项

你当前的useEffect依赖数组为空,只会在组件首次挂载时触发拉取,如果组件挂载后id prop发生变化,不会重新请求数据,建议把id加入依赖数组:

import React from 'react'
import { useState,useEffect } from 'react'
import { FirebaseService } from '../../Services/FirebaseService'
const NewList = ({id}) => {
  const [data,setData] = useState([])
  useEffect(()=>{
    console.log(id)
    const fetchMarketData = async () =>{
      const marketData =  await FirebaseService(id);
      setData(marketData);
    }
    if(id) fetchMarketData(); // 可选:id存在时才发起请求
    return () => {
    }
  },[id]) // 把id加入依赖数组
  return (
    <div>
      {/* 你初始值设的是[],所以不需要判断undefined,直接判断长度即可 */}
       {data.length>0 ? data.map((d,idx)=><p key={idx}>{d.id}</p>)
                        :<p>no data yet</p>}
    </div>
  )
}

export default NewList

其他优化建议

你现在同时用了async/await和.then()两种异步写法,风格不统一,可以改成纯async/await的写法更易读:

export const FirebaseService = async (id) => {
  id=id.replace(/['"]+/g, "");
  const historyKey="/coins/0/"+id
  const snapshot = await db.ref(historyKey).once('value')
  const data = snapshot.val();
  const formattedResponse= formatMarketData(data);
  console.log(formattedResponse)
  return formattedResponse
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:04