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

248
Vistas
¿Cómo tener una función llamando secuencialmente a otras funciones y emitiendo eventos?

No sé si esto está duplicado, pero no pude encontrar una respuesta.

Estoy desarrollando una biblioteca Typescript para una aplicación web. Necesito una función f que necesitaría llamar secuencialmente a otras funciones y emitir eventos para que la persona que llama los escuche.

Pseudocódigo:

 function f(arg1, arg2, arg3) { const r1 = b() // wait for b execution emit('phase1', r1) const r2 = c() // wait for c execution emit('phase2', r2) const r3 = d() // wait for d execution emit('phase3', r3) } f('1', 3, '4').once('phase1', doSomething).once('phase3', somethingElse)

Usar async/await me permitiría ejecutar secuencialmente las funciones internas, pero en ese caso f necesitaría devolver una Promesa, perdiendo así la posibilidad de emitir eventos. Si elijo devolver un emisor de eventos, perdería legibilidad ya que las funciones internas no podrían esperarse secuencialmente.

Encontré esta interesante biblioteca Promievent , inspirada en web3, pero, dado que creo que esta es una aplicación no tan rara, me preguntaba si hay un mejor enfoque/patrón para usar.

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

0

¿Qué tal una función de generador que produce eventos? p.ej

 function* f() { const r1 = b() yield ['phase1', r1] const r2 = c() yield ['phase2', r2] }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Como ya sugirió Josh Bothun , se podría elegir un enfoque basado en generator functions generadoras y generators .

Dado que, por lo que se puede ver en la implementación de pseudocódigo proporcionada por el OP de la function f(arg1, arg2, arg3) { /* ... */ } , las funciones/métodos asíncronos podrían proporcionarse como parámetros para dicha función. Y dado que uno debe await el resultado de cada llamada de función, debe optar por un enfoque de generador asíncrono que haga que el f original del OP también sea asíncrono para ser implementado.

Y en cuanto a las preocupaciones del OP...

"... pero en ese caso f necesitaría devolver una [p]romita, perdiendo así la posibilidad de emitir eventos"

... de causa uno siempre puede emitir/disparar/despachar eventos desde cualquier función asíncrona. Y la promesa en la que dicha función está envuelta/incrustada no siempre necesita devolver un valor significativo ni siempre necesita ser manejada (aquí, por ejemplo, por await ... vea también la invocación final (no manejada) de lo que se proporciona a continuación implementación asíncrona).

 // an async function and event type generator-function. async function* createAsyncFunctionAndEventTypeIterable(asyncFunctions) { let asyncFct; while (asyncFct = asyncFunctions.shift()) { yield (await asyncFct()); } } // the OP's function which needs to be implemented as async. async function awaitAndEmitOneAfterTheOther(...asyncFunctions) { // asyncFunctions = asyncFunctions.flat(); const asyncIterable = createAsyncFunctionAndEventTypeIterable(asyncFunctions); for await (const [type, value] of asyncIterable) { emit(type, value); } } // test setup // the event emitter mock. function emit(type, value) { console.log('emit ...', { type, value }); } function createAsyncTestFunctionAndEventType(delay, type, value) { return async function () { return await ( new Promise(resolve => setTimeout(resolve, delay, [type, value])) ); } } const [ asyncFct_1, asyncFct_2, asyncFct_3, ] = [ [2000, 'phase1', 'foo'], [1000, 'phase2', 'bar'], [3000, 'phase3', 'baz'], ].map(([delay, type, value]) => createAsyncTestFunctionAndEventType(delay, type, value) ); // execute test. console.log('... test started ...'); awaitAndEmitOneAfterTheOther(asyncFct_1, asyncFct_2, asyncFct_3);
 .as-console-wrapper { min-height: 100%!important; top: 0; }

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