angular - Angular Firebase 更新代码未在快照 foreach 中执行
问题描述
我正在尝试使用以下代码更新我的 firebase 数据库字段:
//delete user token
delete_user_device_token() {
let ref = this.afDatabase.database.ref("users/" + this.afAuth.auth.currentUser.uid + "/chats");
let groups = this.afDatabase.database.ref("users/" + this.afAuth.auth.currentUser.uid + "/groups");
let data = {};
groups.once("value").then(snapshot => {
snapshot.forEach(group => {
data["groups/" + group.key + "/users/" + this.afAuth.auth.currentUser.uid + "/device_token"] = null;
})
this.afDatabase.database.ref().update(data);
console.log("1")
})
ref.once("value").then(snapshot => {
snapshot.forEach(chat => {
data["users/" + chat.key + "/chats/" + this.afAuth.auth.currentUser.uid + "/user/device_token"] = null;
})
this.afDatabase.database.ref().update(data);
console.log("2")
})
data["users/" + this.afAuth.auth.currentUser.uid + "/device_token"] = null;
console.log("3")
return this.afDatabase.database.ref().update(data);
}
但是,当我调用时,不会执行 foreach 循环内的代码:
this.firebaseProvider.delete_user_device_token().then(() => {
//logout
this.authProvider.logout().then(() => {
//toaster
this.toastCtrl.create({
message: 'You have been logged out',
duration: 3000
}).present();
});
});
结果在控制台日志中:
3
如您所见,只有 delete_user_deivce_token 中的最后一次更新有效,我可以在数据库中确认这一点,快照 foreach 中的代码没有执行,我在网上查看过,似乎可以使用 Promise.all 解决这个问题,但我'我不确定如何在我的代码中实现这一点。
解决方案
Firebase 的操作是异步的并返回 Promise,你需要处理它。
使用异步/等待的示例:
//delete user token
async delete_user_device_token() {
let ref = this.afDatabase.database.ref("users/" + this.afAuth.auth.currentUser.uid + "/chats");
let groups = this.afDatabase.database.ref("users/" + this.afAuth.auth.currentUser.uid + "/groups");
let data = {};
const foo1 = await groups.once("value");
foo1.forEach(group => {
data["groups/" + group.key + "/users/" + this.afAuth.auth.currentUser.uid + "/device_token"] = null;
})
console.log("1")
const foo2 = await ref.once("value");
foo2.forEach(chat => {
data["users/" + chat.key + "/chats/" + this.afAuth.auth.currentUser.uid + "/user/device_token"] = null;
})
console.log("2")
data["users/" + this.afAuth.auth.currentUser.uid + "/device_token"] = null;
console.log("3")
return this.afDatabase.database.ref().update(data);
}
输出除外:
1
2
3
您正在执行多次相同的更新,这真的是您想要做的吗?您可以一次更新多个节点。
如果您想要一个最干净的答案,请添加解释。
推荐阅读
- oracle - 如何避免 OR 扩展?
- vue.js - 在 b-form 中使用 Vue Validate 滚动到第一个错误
- react-native - 初始化 react-native-twitter-signin 时出现异常
- r - ggplot2散点图添加自定义置信区间带线;类似于 abline() 方法
- python - 有一个特殊的网页找不到任何元素
- java - 尊重非@Primary @Bean 上的@Lazy 注释
- flutter - 如何在 dart/flutter 中监听流值
- react-native - 在 React Native 中使用离线存储图像的最佳方式
- xpath - Xpath 在每 li 之后插入 ","
- python - 如何在 django rest 框架中获得评分计数