如何从Firebase获取数据并返回对象而非Promise
解决方法
首先明确:所有带async标记的函数必然返回Promise,因为内部依赖了异步操作(Firebase的getDocs是异步请求),没法让它直接返回普通对象——异步操作必须等待完成才能拿到结果,这是JavaScript异步机制的固有特性。
要在getData里拿到实际的对象数据,有两种常用处理方式:
写法一:将getData改为async函数,用await获取结果
async function getData(tab){ var data = await getDataSetFromFirebase(tab); console.log(data); // 此处打印的就是实际的数组对象 return data; // 此时getData也会返回Promise,外部调用它时同样需要用await或.then()处理 } async function getDataSetFromFirebase(tab){ const allData = []; const q = query(collection(db, '0M0drKmwJCWal7XHjHKuPz3rhHQ2')); const querySnapshot = await getDocs(q); // 简化数组组装逻辑,替代原有的重复push操作 querySnapshot.forEach(cl => { allData.push([cl.data().company, cl.id]); }); // 直接返回组装好的数组,无需多余的Promise.resolve return allData; }
写法二:在getData里用.then()回调处理Promise
function getData(tab){ getDataSetFromFirebase(tab) .then(data => { console.log(data); // 此处拿到实际的对象数据 // 后续对data的业务操作写在这个回调内 }) .catch(err => { // 处理Firebase请求可能出现的错误 console.error('获取数据失败:', err); }); } async function getDataSetFromFirebase(tab){ const allData = []; const q = query(collection(db, '0M0drKmwJCWal7XHjHKuPz3rhHQ2')); const querySnapshot = await getDocs(q); querySnapshot.forEach(cl => { allData.push([cl.data().company, cl.id]); }); return allData; }
额外优化说明:
- 移除了原代码中多余的
const allClientsData = await Promise.resolve(allData);,因为allData是同步组装的数组,直接返回即可 - 简化了客户端数据的组装逻辑,用数组字面量替代重复的
push操作,代码更简洁清晰
内容的提问来源于stack exchange,提问作者Mohit H
相关产品推荐
相关产品推荐

