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

114
Views
.subscribe no se está ejecutando en el orden correcto

Usando Angular y la biblioteca RxJS.

Tengo un método simple:

 method(){ const data = this.data; const moreData = this.moreData; this.anotherMethodOne(data) this.anotherMethodTwo(moreData) }

Como puede ver, estoy llamando a otros dos métodos. anotherMethodOne() debe ejecutarse antes anotherMethodTwo() , y lo es.

Dentro anotherMethodOne() tengo un .subscribe :

 anotherMethodOne(data) { <!-- at this point it jumps out of this method and continues to proceed in the parent method, but returns later --> this.service.getService(id).subscribe(res => { res } }

Tan pronto como mi depurador golpea la llamada .subscribe, vuelve al method() y procede a ejecutar this.anotherMethodTwo(moreData) . Luego regresa a this.anotherMethodOne(data) para finalmente completar .subscribe ; sin embargo, en este momento ya es demasiado tarde.

Necesito asegurarme de que this.anotherMethodOne(data) se complete por completo antes de que se this.anotherMethodTwo(moreData) o asegurarme de que .subscribe se ejecute antes de continuar.

Empecé a mirar switchMap y concat en la biblioteca RxJS, pero no estaba seguro de cómo se implementaría en mi caso.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

No puede garantizar que un observable se haya emitido antes de proceder con su valor emitido. Por lo tanto, debe devolver el observable de los métodos y suscribirse donde se requiere su valor.

Para observables dependiendo de las emisiones de otros observables, puede usar un operador de mapeo de orden superior como switchMap . Más info sobre ellos aquí .

 method(){ const data = this.data; const moreData = this.moreData; this.anotherMethodOne(data).pipe( switchMap((someValue) => this.anotherMethodTwo(moreData) ) ).subscribe({ // callbacks }); } anotherMethodOne(data): Observable<any> { return this.http.get('url'); } anotherMethodTwo(moreData): Observable<any> { return this.http.get('url'); }
about 4 years ago · Juan Pablo Isaza Report

0

Cuando se trata de funciones asincrónicas, debe permanecer con el enfoque reactivo y no intentar determinar cuándo finalizó un determinado código, sino simplemente esperar a que finalice y luego invocar la devolución de llamada o el controlador responsable posteriormente. Piensa sobre esto. ¿Qué es la suscripción que nunca devuelve nada? ¿Está bien? ¿Qué sucede si se tarda mucho tiempo en devolver algo? ¿También está bien?

Pero para solucionar el problema en cuestión, simplemente mueva anotherMethodTwo a la suscripción. Luego, cuando se devuelve algo, se ejecuta anotherMethodTwo .

 method(){ const data = this.data; const moreData = this.moreData; this.anotherMethodOne(data) } anotherMethodOne(data) { this.service.getService(id).subscribe(res => { console.log(res) this.anotherMethodTwo(moreData) } }

Seguir este camino sería similar al infierno de devolución de llamada asíncrona, cuyo estilo de anidamiento no se recomienda, pero lo hará por ahora.

about 4 years ago · Juan Pablo Isaza 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!