Angular не отправляет правильные данные в firebase - PullRequest
0 голосов
/ 06 апреля 2020
private currentInfo:string[];
private useruid: string;
...
constructor(private AngularAuth: AngularFireAuth,
    private db:AngularFirestore) { }

...

sendInfo(text:string){
    this.readInfo();
    this.currentInfo.push(text);
    this.db.collection('users').doc(this.useruid).update({
        Info: this.currentInfo
    })
}
...
readInfo(){
    this.useruid = this.AngularAuth.auth.currentUser.uid;
    this.db.collection('users').doc(this.useruid).snapshotChanges().subscribe(a=>{
      const data = a.payload.data() as {name:string, Info:string[]};
      data.Info.forEach(element => {
        this.currentInfo.push(element);
      });
    })
}

Добрый день, я не могу найти решение этой проблемы, у меня есть 1 метод readInfo () , который читает информацию о текущем пользователе из firebase, этот метод работает, очевидно, когда я пытаюсь Помимо другой части кода, однако я хочу обновить эту информацию с помощью некоторого text: string , однако, когда я его запускаю, он одновременно считывает базу данных и записывает новую информацию this. currentInfo . Таким образом, firebase не обновляется с текущей информацией.

В качестве примера представьте, что у меня в настоящее время есть currentInfo = ["a", "b", "c"] и как text = "d" , после того, как y запустит метод sendInfo () , в firebase записывается только ["d"].

Заранее спасибо за помощь !!

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Метод snapshotChanges() здесь asyn c, поэтому запись выполняется до окончания чтения. Затем переместите свои update операторы в subscribe вызов:

sendInfo(text:string){
    this.useruid = this.AngularAuth.auth.currentUser.uid;
    this.db.collection('users').doc(this.useruid).snapshotChanges().subscribe(a=>{
      const data = a.payload.data() as {name:string, Info:string[]};
      data.Info.forEach(element => {
        this.currentInfo.push(element);
      });
      // Add the text to currentInfo and save
      this.currentInfo.push(text);
      this.db.collection('users').doc(this.useruid).update({
        Info: this.currentInfo
      })...
    })
}
0 голосов
/ 07 апреля 2020
sendInfo(text:string){
this.readInfo(); //As Olivier Depriester said this function is called but you are not waiting for the data to be read.
this.currentInfo.push(text);
this.db.collection('users').doc(this.useruid).update({
    Info: this.currentInfo
})

}

для проблемы infinte l oop, объявите еще одну копию this.currentInfo и используйте одну для l oop, а другую для конечных значений.

...