es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 usar firstValueFrom() o lastValueFrom() en su lugar.

    Como mencionaste, .get() puede devolver una colección de objetos, por lo que es necesario utilizar firstValueFrom() o lastValueFrom() 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() y take(1) para obtener un único valor:

    import { take } from 'rxjs/operators';
    
    async readDocument(collectionPath: string, key: string): Promise<any> {
      const path = `${collectionPath}/${key}`;
      return this.firestore.doc(path)
        .valueChanges()
        .pipe(take(1))
        .toPromise();
    }
    

    Al utilizar .valueChanges(), obtendrás el valor único del documento, y al aplicar take(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.

Comments are closed.