首页 > 解决方案 > 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 解决这个问题,但我'我不确定如何在我的代码中实现这一点。

标签: angularfirebaseionic-frameworkfirebase-realtime-database

解决方案


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

您正在执行多次相同的更新,这真的是您想要做的吗?您可以一次更新多个节点。

如果您想要一个最干净的答案,请添加解释。


推荐阅读