快照foreach内未执行Angular Firebase更新代码

时间:2019-10-14 07:16:32

标签: angular firebase ionic-framework firebase-realtime-database

我正在尝试使用以下代码更新我的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来解决此问题。 ,但我不确定如何在代码中实现此功能。

1 个答案:

答案 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

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

如果您想要最干净的答案,请添加说明。