过去四个小时,我一直在为此苦苦挣扎。我正在编写一个函数来查看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;
}
};
答案 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指出该代码中的问题)