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

354
Vistas
Administrar funciones de sincronización y asíncronas en una pila de llamadas de algoritmo

TLDR: ¿debo usar async y await a través de una pila de llamadas complicada si la mayoría de las funciones no son realmente async ? ¿Existen patrones de programación alternativos?

Contexto

Esta pregunta probablemente se trate más de patrones de diseño y arquitectura de software general que de un problema de sintaxis específico. Estoy escribiendo un algoritmo en node.js que es bastante complicado. El flujo del programa implica una llamada asíncrona inicial para obtener algunos datos y luego pasa a una serie de pasos de cálculo síncronos basados en los datos. Los pasos de cálculo son iterativos y, a medida que iteran, generan resultados. Pero ocasionalmente, si los cálculos cumplen ciertas condiciones, será necesario obtener más datos. Aquí hay una versión simplificada en forma de diagrama:

ingrese la descripción de la imagen aquí

El bucle calcStep se ejecuta miles de veces sincrónicamente, impulsando los resultados. Pero ocasionalmente regresa a getData , y el programa debe esperar a que ingresen más datos antes de continuar nuevamente con el bucle calcStep .

En codigo

Una versión reducida de lo anterior podría verse así en el código JS:

 let data; async function init() { data = await getData(); processData(); calcStep1(); } function calcStep1() { // do some calculations calcStep2(); } function calcStep2() { // do more calculations calcStep3(); } function calcStep3() { // do more calculations pushToResults(); if (some_condition) { getData(); // <------ question is here } if (stop_condition) { finish(); } else { calcStep1(); } }

Donde pushToResults y finish también son funciones síncronas simples. Escribo las funciones calcStep aquí separadas porque en el código real, en realidad son métodos de clase de clases definidas en función de la separación de preocupaciones.

El problema

Surge el problema obvio de que si se cumple some_condition , y necesito esperar para obtener más datos antes de continuar con el ciclo calcStep , necesito usar la palabra clave await antes de llamar a getData en calcStep3 , lo que significa que calcStep3 debe llamarse async , y debemos await que también en calcStep2 , y en toda la cadena, incluso las funciones síncronas deben etiquetarse como async y await ed.

En este ejemplo simplificado, no sería tan ofensivo hacer eso. Pero en realidad, mi algoritmo es mucho más complicado, con una pila de llamadas mucho más profunda que involucra muchos métodos de clase, iteraciones, etc. ¿Existe una mejor manera de administrar las funciones en await en este tipo de escenario? ¿Otras herramientas que puedo usar, como generadores o emisores de eventos? Estoy abierto a soluciones simples o cambios de paradigma.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Si no desea sincronizar la función y async en la cadena, use .then() . Deberá duplicar el siguiente código dentro .then() ; puede simplificar esto poniéndolo en su propia función.

 function maybeRepeat() { if (stop_condition) { finish(); } else { calcStep1(); } } function calcStep3() { // do more calculations pushToResults(); if (some_condition) { getData().then(maybeRepeat); } else { maybeRepeat() } }
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