我正在尝试使用以下代码更新我的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来解决此问题。 ,但我不确定如何在代码中实现此功能。
答案 0 :(得分:1)
Firebase的操作是异步的,并返回Promise,您需要处理它。
使用async / await的示例:
//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
您要进行几次相同的更新,这真的是您想要做的吗?您可以一次更新来更新多个节点。
如果您想要最干净的答案,请添加说明。