Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

115
Vistas
¿Cómo recupero una URL de descarga de almacenamiento desde dentro de una colección de firestore usando RxJS?

Estoy usando Angular 12 con AngularFire/Firebase 9 (Modular). Tengo problemas para usar RxJS para recuperar la URL de descarga del almacenamiento y agregarla a cada elemento de un resultado de colección. Con el siguiente código, puedo ver los datos en la consola en "ZoneAwarePromise", pero no puedo ver los datos a través de la plantilla.

 const listCollection = collectionData(collection(this.firestore, 'lists'), {idField: 'id'}); this.lists = listCollection.pipe(take(1), map(lists => lists.map(async list => { const imgRef = ref(this.storage, list.metaImage); const coverImg = await getDownloadURL(imgRef); return {...list, coverImg} })));
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Es difícil estar seguro de lo que ha escrito aquí, pero se parece a this.lists es un observable que emite una lista de promesas. Eso es lo que hace la palabra clave async, es azúcar sintáctico para crear promesas.

No ha tomado/usado los valores de las promesas en ninguna parte (es decir: no los está await en ninguna parte).

Una solución es reescribir sus promesas como observables usando forkJoin para ejecutar su matriz de observables.

Eso podría verse así:

 const listCollection = collectionData(collection(this.firestore, 'lists'), {idField: 'id'}); this.lists = listCollection.pipe( take(1), map(lists => lists.map(list => { const imgRef = ref(this.storage, list.metaImage); return from(getDownloadURL(imgRef)).pipe( map(coverImg => ({...list, coverImg})) ) })), switchMap(listsCalls => forkJoin(listsCalls)) );
about 4 years ago · Juan Pablo Isaza Denunciar

0

Usar un switchMap para combinar los resultados funciona; sin embargo, causa algunos problemas de bloqueo de procesamiento en Angular (es decir, esperar a que todos los elementos de la "lista" devuelvan getDownloadUrl() antes de que la plantilla pueda mostrar los resultados). Eliminar "async" y "await" del código original y agregar una canalización "async" a la plantilla de Angular permite que los datos fluyan sin bloquear el renderizado.

lista.componente.ts

 const listCollection = collectionData(collection(this.firestore, 'lists'), {idField: 'id'}); this.lists = listCollection.pipe(take(1), map(lists => lists.map(list => { const imgRef = ref(this.storage, list.metaImage); const coverImg = getDownloadURL(imgRef); return {...list, coverImg} })));

lista.componente.html

 <div class="card" *ngFor="let list of lists | async"> <div class="card-image"> <img [src]="list.coverImg | async" /> </div> <h2 class="card-title-lower"> <a [routerLink]="['/list', list.id]">{{ list.title }}</a> </h2> </div>
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda