如何在承诺中返回值? (Firebase.get())

时间:2020-07-06 00:54:48

标签: javascript firebase asynchronous google-cloud-firestore

过去四个小时,我一直在为此苦苦挣扎。我正在编写一个函数来查看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;
  }
};

1 个答案:

答案 0 :(得分:2)

如下更改代码:

put_nowait

要记住的关于await write_message的要点是,它实际上并没有使异步调用同步,而只是使它们看起来像这样,从而使您的代码在包装承诺和类似内容方面不太麻烦。每个异步函数都会返回一个承诺,因此,如果您要处理它返回的内容,则需要直接处理该承诺(使用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。在后一种情况下,您当然也需要将使用函数声明为.then...

关于第一个功能,这里不需要await。只要兑现诺言。 (感谢@charlieftl指出该代码中的问题)