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

187
Views
¿Cómo esperar los resultados de múltiples métodos asíncronos envueltos en un bucle for?

Estoy desarrollando un algoritmo de búsqueda que busca en 3 bases de datos e imprime los resultados. La estructura general del código se parece a esto:

 for(type in ["player", "team", "event"]){ this.searchService.getSearchResult(type).toPromise() .then(search_result => { if(type == "player"){ this.player_search_results_full = this.getPlayerSearchResults(search_result, search_string); } if(type == "team"){ this.team_search_results_full = this.getTeamSearchResults(search_result, search_string); } if(type == "event"){ this.event_search_results_full = this.getEventSearchResults(search_result, search_string); } }) } // this.getFinalDisplayResults() getFinalDisplayResults(){ // Do some actions on <type>_search_results_full lists }

Esos <type>_search_results_full serán una lista que contiene la lista completa de coincidencias para search_string. Luego, me gustaría esperar a que se completen todas esas listas, luego ejecutarlas a través de otro método getFinalDisplayResults que elige un total de X resultados para mostrar de esas listas completas.

El problema al que me enfrento es que this.getFinalDisplayResults() se ejecuta antes de que esas listas <type>_search_results_full estén llenas. Intenté poner todo en el bucle for en un método separado getFullResults() y luego hacer algo como esto:

 async getFinalDisplayResults(){ await getFullResults() // Do something }

Pero eso parece no funcionar, ya que agregar algunos registros muestra que el ciclo for en getFullResults() finaliza sin que se llenen las listas.

No tengo una gran comprensión de toPromise() y los métodos asincrónicos, así que estoy seguro de que me estoy acercando a esto incorrectamente. ¿Puede alguien ayudarme a entender qué debería hacer en su lugar?

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

0

Creo que sé lo que intenta lograr y el problema que tiene, this.getFinalDisplayResults() se ejecuta antes de que tenga los resultados porque la lógica dentro del bucle for es asíncrona, por lo que la solución sería.

 async function getDataFromBackend () { for(let type in ["player", "team", "event"]) { const searchResult = await this.searchService.getSearchResult(type).toPromise() if(type === "player") this.player_search_results_full = this.getPlayerSearchResults(searchResult, search_string); if(type === "team") this.team_search_results_full = this.getTeamSearchResults(searchResult, search_string); if(type === "event") this.event_search_results_full = this.getEventSearchResults(searchResult, search_string); } } async function getFinalDisplayResults() { await getDataFromBackend(); // this will ensure you have the data, before you do the rest of the process //rest of the logic here }
about 4 years ago · Juan Pablo Isaza Report

0

Creo que lo que está buscando es Promise.all , ya que toma una serie de Promise y se resuelve en una serie de resultados.

Con tu ejemplo, podría ser algo como:

 const results = await Promise.all(["player", "team", "event"].map( type => this.searchService.getSearchResult(type).toPromise() ))
about 4 years ago · Juan Pablo Isaza Report

0

Podemos limpiarlo un poco, principalmente al iterar las cosas que varían en la variedad de tipos.

 const promises = [ { type: 'player', method: 'getPlayerSearchResults'}, { type: 'team', method: 'getTeamSearchResults'}, { type: 'event', method: 'getEventSearchResults'} ].map(obj => { return this.searchService.getSearchResult(obj.type).toPromise().then(search_result => { return this[obj.method].bind(this)(search_result, search_string); }) }); return Promise.all(promises);
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!