Как дождаться ответа FirebaseListObservable

Я делаю приложение Angular2 с Angularfire2. Я застрял в проблеме с FirebaseListObservable при получении данных из Firebase. Вот мой код.

this.requests = this._af.database.list('/requests');

Вскоре после этого я зарегистрировал эту переменную.

console.log(this.requests);

Затем я получил неопределенный, но я хотел дождаться ответа на этот запрос, потому что this.requests всегда был неопределенным в этом коде. Я бы хотел, чтобы вы научили меня ждать результатов запросов Firebase. Извините за мой плохой английский.


person taku845    schedule 30.11.2016    source источник


Ответы (2)


Поскольку получение данных из Firebase является асинхронным, вам необходимо «подписаться» на событие, когда приходят запрошенные данные. Важно закрыть (отписаться) соединение после того, как оно больше не используется, чтобы избежать дальнейшие проблемы. Этого можно добиться с помощью следующего кода:

this.requests = this._af.database.list('/requests')
  .subscribe(data => {
    data.forEach(obj => {
      console.log(obj.$key);
      console.log(obj.$value);
    });
    this.requests.unsubscribe();
});

Если вы хотите сохранить соединение, потому что вы обновляете свои данные, вам следует опустить this.requests.unsubscribe(); и вместо этого поставить

ngOnDestroy(){
  this.requests.unsubscribe();
}

в вашем компоненте, поэтому соединение закрывается, когда ваш компонент уничтожается.

person Niklas    schedule 30.11.2016
comment
Спасибо за ваш комментарий. Я не знал об этом методе отказа от подписки, поэтому я собираюсь узнать, как я могу использовать его, чтобы закрыть соединение. - person taku845; 30.11.2016

Метод list возвращает Observable, чтобы вы могли подписаться на него, чтобы получать возвращаемые запросы.

  export class AppComponent {
    requests: FirebaseListObservable<any[]>;

    constructor(private af: AngularFire) {

    }

    ngOnInit() {
      this.requests = this.af.database.list('/requests');

      this.requests.subscribe(
        (requests) => {
          console.log(requests)
        },
        err => console.log(err)
      );
    }
  }
person JayChase    schedule 30.11.2016
comment
Спасибо, и у меня есть дополнительный вопрос. Лучше ли вызывать запрос в ngOnInit, чем в конструкторе? Я узнал, что конструктор вызывается перед ngOnInit. Я всегда не могу решить, что использовать. Если хотите, я надеюсь, вы ответите на это. - person taku845; 30.11.2016
comment
@таку. Это хорошая практика, дополнительную информацию см. в этой ветке. - person JayChase; 30.11.2016
comment
Спасибо! Я увижу это. - person taku845; 30.11.2016