У меня есть рабочий код, который запрашивает Firestore и возвращает Observable типа ImageUploadWId[]
. Я хотел бы вернуть Promise
вместо этого. Это потому что
- мои данные меняются не часто;
- Я выполняю удаление на основе входящих данных.
SnapshotChanges()
возвращает массив действий. Первое действие содержит неполный массив размера 1. Последнее действие содержит массив размера 4. Последний массив завершен; у него есть все ImageUploadWIds
от одного groupId
.
Мне нужен только один массив, который имеет ImageUploadWIds
только из назначенного groupId. Использование Обещания дает мне ImageUploadWIds
из всех groupIds
. Я полагаю, что пункт where не работает.
Вот мой рабочий код, который печатает только imageUpload
groupIds из одного groupId, но возвращает более одного массива. Последний массив - единственный, который мне нужен. Изменить (добавлены записи журнала):
getImageInfosWIds(bathroomGroupId: string): Observable<ImageUploadWId[]> {
return this.afs.collection(this.bathroomImagesLocation,
ref => ref.where('groupId', '==', bathroomGroupId)).snapshotChanges()
.map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
const imageUpload = new ImageUploadWId();
imageUpload.set(id, <ImageUpload>data);
return imageUpload;
})
})
}
onDeleteGroup(groupId: string) {
this.bathroomGroupService.getImageInfosWIds(groupId)
.subscribe((imageUploads) => {
console.log("imageUploads.length: " + imageUploads.length);
for (let imageUpload of imageUploads) {
console.log("(groupId, filename): (" + imageUpload.groupId + ", " + imageUpload.filename + ")");
}
})
}
Вот мой код, пытающийся использовать Обещание. Это печатает imageUploads из обеих моих групп, а не только из заданного bathroomGroupId.
getImageInfosWIds(bathroomGroupId: string): Promise<QuerySnapshot> {
return this.afs.collection(this.bathroomImagesLocation,
ref => ref.where("groupId", "==", bathroomGroupId))
.ref
.get();
}
onDeleteGroup(groupId: string) {
this.bathroomGroupService.getImageInfosWIds(groupId)
.then( (querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log("edit-bathrooms: " + doc.data().groupId);
})
},
() => {console.log("Error in edit-bathrooms. promise unfullfilled " +
"in onDeleteGroup( " + groupId + " )")});
}
Редактировать: это последний код, который работал:
onDeleteGroup(groupId: string) {
this.bathroomGroupService.getImageInfosWIdsObservable(groupId)
.pipe(take(1)).subscribe(
data => {
console.log(data[0].groupId);
});
}
getImageInfosWIdsObservable(bathroomGroupId: string) {
return this.afs.collection(this.bathroomImagesLocation,
ref => ref.where('groupId', '==', bathroomGroupId)).snapshotChanges() //rxjs 5 -> 6 library
.pipe(
map(actions => actions.map(a => {
const data = a.payload.doc.data();
const documentId = a.payload.doc.id;
const imageUpload = new ImageUploadWId();
imageUpload.set(documentId, <ImageUpload>data);
return imageUpload;
}))
);
}
Только одно последнее слово. Если вы все еще получаете дополнительный массив, вы, возможно, подписались на ту же коллекцию Firestore в другой части вашего кода и не отменили подписку. Это было частью моей проблемы.