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

1.3K
Vistas
Cómo devolver valor dentro de Subscribe Angular 4

Soy nuevo en observables en angular. Tengo un problema en el que quiero devolver un valor dentro de un método de suscripción. Tengo el siguiente método ( getFirebaseData(idForm:string):observable <any[]> ):

 getTotalQuestions(idForm:string){ let totalQuestions:number; this.getFirebaseData(idForm+"/Metadatos") .subscribe(items => { items.map(item => { totalQuestions=item.Total; console.log(totalQuestions); }); } ); console.log(totalQuestions); return totalQuestions; }

el primer console.log(totalQuestions) imprime 4 pero el segundo console.log(totalQuestions) imprime undefined . Entiendo que subscribe es una operación asíncrona y por eso el segundo console.log(totalQuestions) ("Para escribir el código") imprime indefinido, pero no encuentro la forma de devolver la variable después de que se ha realizado el método subscribe terminado. Ahora, si cambio la suscripción al mapa:

 getTotalQuestions(idForm:string){ let totalQuestions:number; this.getFirebaseData(idForm+"/Metadatos") .subscribe(items => { items.map(item => { totalQuestions=item.Total; console.log(totalQuestions); }); } ); console.log(totalQuestions); return totalQuestions; }

el primer console.log(totalQuestions) no imprime nada y el segundo console.log(totalQuestions) imprime sin definir. Es algo que no entiendo por qué sucede.

Espero me puedan ayudar a aclarar el concepto que no entiendo. ¡Gracias!

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

No puede devolver directamente preguntas totales como esa, necesita usar un tema para lograrlo.

 getTotalQuestions(idForm:string): Observable<string> { let totalQuestions:number; var subject = new Subject<string>(); this.getFirebaseData(idForm+"/Metadatos") .subscribe(items => { items.map(item => { totalQuestions=item.Total; console.log(totalQuestions); subject.next(totalQuestions); }); } ); return subject.asObservable(); }

Uso: getTotalQuestion(idForm).subscribe((r)=>console.log(r))

over 4 years ago · Santiago Trujillo Denunciar

0

Para resolver esto crearía una propiedad totalQuestions$ un observable

En el archivo TS

 totalQuestions$ = this.getFirebaseData(idForm + "/Metadatos").pipe( map(items => items.reduce((prev, {Total}) => prev + Total), 0))) )

Y ahora en su plantilla puede usar tubería async

 <span>{{ totalQuestions$ | async }}</span>

Si desea usar la variable en su archivo TS, puede usar operadores combinados como forkJoin o combineLatest para acceder a este valor

 newVariable$ = combineLatest([totalQuestions$, ...]).pipe( map(([totalQuestions, ... ]) => { // Perform an operation here and return a value }) )
over 4 years ago · Santiago Trujillo Denunciar

0

Observable se ejecuta cuando se suscribe a él y lo que regresa de la suscripción siempre es un objeto de suscripción como setInterval. primer ejemplo: debido a que se trata de una llamada asíncrona, el segundo console.log no esperará a que finalice la suscripción antes de ejecutarse.

 getTotalQuestions(idForm: string) { let totalQuestions: number; return this.getFirebaseData(idForm + "/Metadatos").pipe( map(items => items.map(item => { totalQuestions = item.Total; console.log(totalQuestions); }); )); } getTotalQuestions('231').subscribe(console.log)
over 4 years ago · Santiago Trujillo 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