Чтобы создать приложение с Ionic 3, я извлекаю некоторые данные из Firebase, используя Geofire, а затем создаю массив с дополнительными данными. Я хотел бы видеть, когда этот массив заполняется, чтобы я мог остановить загрузку компонента, как только массив вернет некоторые значения на мою страницу.
В провайдере моя функция заключается в следующем. Я преобразую массив в наблюдаемое в последнем операторе возврата.
getNearby(lat, long, rad): Observable<any>
var locations = [];
const firebaseRef: firebase.database.Reference =
firebase.database().ref('/storeLocs/');
const geoFire: any = new Geofire(firebaseRef);
this.queryActive = geoFire.query({
center: [lat, long],
radius: rad
});
this.queryActive.on("key_entered", function(key,
location, distance) {
var dist: number = distance.toFixed(1);
firebase.database().ref(`/storeInfo/${key}/`)
.on("value", snap => {
locations.push({
distance: dist,
description: snap.val().description,
name: snap.val().name
});
return false;})});
this.locList = locations;
return Observable.of(this.locList);
}
Это файл ts страницы:
this.loading=this.loadingCtrl.create();
this.loading.present();
this.storeList =
this.locProv.getNearby(44.642,-78.379, 50);
this.storeList.subscribe(list => {
if (list.length > 0) {this.loading.dismiss()};
console.log(list);
console.log(list.length);
})
Данные, которые я извлекаю в наблюдаемом storeList, правильно отображаются на моем экране, но console.logs показывает [] и 0 соответственно, и, конечно, контроллер загрузки не удаляется.
Мои данные правильно отображаются на экране. Поэтому переменная storeList обновляется, когда она заполняется данными из базы данных, но подписка на самом деле не фиксирует обновление. Я также проверил, обновляется ли storeList с помощью setTimeout, и когда я проверяю его (скажем, через 500 мс), консольный журнал правильно печатает массив, полученный из базы данных.
Как я могу наблюдать за изменениями в этой наблюдаемой, чтобы я мог остановить загрузку контроллера, когда данные извлекаются из базы данных?
Спасибо.