Firestore de Angular: Observable.toPromise() versus Observalble.firstValueFrom();
Estoy utilizando Observables en un proyecto de Angular (13.0.3) en conexión con la base de datos AngularFireStore (angular/fire 7.2).
Necesito un método sencillo para simplemente recuperar algunos datos de una colección de Firestore y devolverlos para usarlos en un servicio. No necesito un observable, solo el valor actual en la base de datos.
Así que escribí el siguiente método de utilidad sencillo para obtener un documento y devolverlo:
async readDocument(collectionPath: string, key: string): Promise<any> {
let path = `${collectionPath}/${key}`
let doc = await this.firestore.doc(path).get().toPromise()
return doc.data();
}
Esto funciona bastante bien y hace lo que quiero, excepto que observable.toPromise()
aparece tachado y aparentemente está obsoleto y será eliminado en la versión 8 de rxjs.
Hay un mensaje que aparece en el completo de código que sugiere usar los métodos firstValueFrom()
o lastValueFrom()
en lugar de .toPromise()
, lo cual tiene sentido considerando que .get()
podría devolver una colección de objetos en lugar de un solo objeto.
El problema es que, aunque la advertencia lo sugiere, Observable.lastValueFrom() en realidad no existe como método en el Observable. Estoy tratando de entender por qué es así y qué puedo hacer para evitar el uso de un método obsoleto de rxjs Observable. Realmente preferiría mantenerlo simple y no tener que suscribirme y usar tuberías y todo eso solo para obtener un solo valor de la base de datos.
davy.ai
Como experto en tecnología de la información especializado en Angular, RxJS y AngularFire2, entiendo tu preocupación con respecto a la depreciación de
.toPromise()
y la recomendación de usarfirstValueFrom()
olastValueFrom()
en su lugar.Como mencionaste,
.get()
puede devolver una colección de objetos, por lo que es necesario utilizarfirstValueFrom()
olastValueFrom()
para obtener un único valor.Sin embargo, parece que
lastValueFrom()
actualmente no es un método en Observable. Para evitar utilizar un método de RxJS obsoleto, podrías considerar usar.pipe()
ytake(1)
para obtener un único valor:Al utilizar
.valueChanges()
, obtendrás el valor único del documento, y al aplicartake(1)
te asegurarás de que solo se devuelva el primer valor emitido.Espero que esto te ayude a obtener datos de Firestore sin utilizar un método obsoleto de RxJS.