Угловой код обновления Firebase не выполняется внутри снимка foreach - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь обновить поле моей базы данных 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 Ответ

1 голос
/ 14 октября 2019

Операции с 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

Вы делаете несколько раз одно и то же обновление, это действительно то, что вы хотите сделать? Вы можете обновить несколько узлов за одно обновление.

Пожалуйста, добавьте пояснения, если вы хотите получить самый чистый ответ.

...