Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.3K
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!