首页 > 解决方案 > 如何在 Promise 中返回值?(Firebase.get())

问题描述

在过去的四个小时里,我一直在为此苦苦挣扎。我正在编写一个函数来查看我的 Firebase 存储中是否存在名为“data”的属性。如果是,我想做一件事,如果不是,我想做另一件事。但是,我无法弄清楚这种异步的东西是如何为我的生活工作的。我在下面简化了我的代码。基本上我只想在到达 if/else 之前等待数据被获取。我一直在尝试不同的选项,但不断出现错误或其他问题。下面的代码是我在代码不会崩溃的情况下最接近的工作,但即使 Firestore 中不存在“数据”,我总是会经历 else 子句,我不知道为什么。有人可以帮我弄清楚我做错了什么吗?

const fetchDataFromDB = async (user) => {
  let query = db
    .collection("users")
    .doc(user)
    .get()
    .then((doc) => {
      doc.data();
      console.log(doc.data().data);
    });

  return await query;
};

export const getSchedule = (miles, user) => {
  const firebaseData = fetchDataFromDB(user);
  console.log(firebaseData);

  // WAIT FOR FETCH BEFORE CONTINUING
  if (!firebaseData) {
    console.log("NOT getting data from FB");
    return;
  } else {
    console.log("getting data from FB");
    return;
  }
};

标签: javascriptfirebaseasynchronousgoogle-cloud-firestore

解决方案


修改代码如下:

const fetchDataFromDB = (user) => {
  return db
    .collection("users")
    .doc(user)
    .get()
    .then((doc) => {
      const data = doc.data();
      console.log(data);
      return data;
    });
};

export const getSchedule = async (miles, user) => {
  const firebaseData = await fetchDataFromDB(user);
  console.log(firebaseData);

  if (!firebaseData) {
    console.log("NOT getting data from FB");
    return;
  } else {
    console.log("getting data from FB");
    return;
  }
};

要记住的一点async await是,它并没有真正使异步调用同步,它只是让它们看起来那样,这样你的代码就不会因为包装好的 Promise 等而变得不那么笨拙。每个异步函数都会返回一个 Promise,所以如果你想处理它返回的内容,你需要直接处理 Promise(使用.then...),或者使用另一个await. 在后一种情况下,您当然还需要声明消费函数async

关于第一个功能,不需要async await那里。只是回报承诺。(感谢@charlieftl 指出该代码中的问题)


推荐阅读