javascript - 如何在 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;
}
};
解决方案
修改代码如下:
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 指出该代码中的问题)
推荐阅读
- powerapps - SharePoint 和 PowerApps 表单...通过从第二个列表中检索数据来自动填充列表字段
- python - 如何使用 pandas 为在单元格中包含字典的数据框创建交叉表
- php - 警告:session_start() 期望参数 1 是数组,给定字符串
- plsql - ORA-19280: XQuery 动态类型不匹配: 预期原子值 - 得到节点
- list - Tcl/Tk:从一列数据创建列表时如何忽略换行符?
- sql - SQL 增量记录数
- c - 在没有 printf 的情况下限制 c 中的浮点精度
- sql - Oracle SQL 中按时间段累积的第 90 个百分位值
- angular - 本地 Angular 构建成功,但 Gitlab 运行器 Angular 构建失败
- node.js - ECS Fargate Node.js child_process NoCredentialProviders:链中没有有效的提供者。已弃用