Не могу наблюдать изменения в наблюдаемом - PullRequest
0 голосов
/ 26 августа 2018

Чтобы создать приложение с 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 мс), консольный журнал правильно печатает массив, полученный из базы данных.

Как я могу наблюдать за изменениями в этой наблюдаемой, чтобы я мог остановить загрузку контроллера, когда данные извлекаются из базы данных?

Спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете подождать, пока событие ready не отменит вашу подписку, и позвонить dismiss.

geoQuery.on("ready", function() {
  // This will fire once the initial data is loaded, so now we can cancel the "key_entered" event listener
  geoQuery.cancel();
});

См. Документация GeoFire

Вы можете использовать fromEventPattern , чтобы создать наблюдаемое из события key_entered и подписаться на это наблюдаемое, где вы можете обновить storeList.

Вы можете поместить весь GeoQuery как обещание , которое разрешается, когда мы получаем событие ready, и отклоняется по истечении времени ожидания (не забудьте отменить подписку наблюдаемого + отменить queryRef).

...