Take (1) со значением коллекции firestore. Изменения иногда не завершены. - PullRequest
0 голосов
/ 06 марта 2020

Я работаю с 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 может быть неполным.

...