Я работаю с AngularFire2 в моем проекте. У меня есть услуга следующим образом
getItems(thing: string): Observable<Item[]> {
return this.db.collections('item', ref => ref.where('things', 'array-contains', thing))
.valuechanges({ idField: 'id' })
}
Затем я подписываюсь на услугу
this.itemService.pipe(take(1)).subscribe(res => console.log(res));
Я использую take (1) как для стоимости завершения подписки, так и потому, что я не не хочу, чтобы значения снова выдавались при изменениях.
Я заметил, что с помощью этого сервиса я получаю периодически неполные результаты. Например, иногда я получаю
[{id: 1, name:widget}, {id:2, name: whatsit}]
, а иногда получаю
[{id: 1, name:widget}]
Без изменений в БД. Я обошел эту проблему, используя
getItems(thing: string): Observable<Item[]> {
return this.db.collections('item', ref => ref.where('things', 'array-contains', thing))
.get().pipe(map(res => res.docs.map(
doc => ({id: doc.id, ...doc.data()} as Item))))
}
Однако, похоже, много лишнего кода. Наверное, я не понимаю, почему первое значение valueChanges может быть неполным.