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

231
Vistas
la función asíncrona no parece ejecutarse dentro del código de sincronización

Estoy tratando de hacer un comando que se conecte a la base de datos, creé un pequeño script CLI que recorre archivos en carpetas específicas para obtener módulos de clase de comando

mi problema es que en uno de mis comandos, intento conectarme para secuenciar, y simplemente no parece estar haciendo nada. no obtengo salida a la consola, ni siquiera parece intentar conectarse

esto probablemente se deba a que todavía estoy luchando por descubrir cómo hacer correctamente las cosas de sincronización / sincronización / espera ... observe cómo uso glob.sync porque quiero recorrer los archivos de forma síncrona, pero luego en mi comando i necesita conectarse a la base de datos usando await

cli.js :

 #! /usr/bin/env node const patterns = [ './node_modules/unity/src/commands/**/*.js', './src/commands/**/*.js', ] const glob = require('glob') const path = require('path') const yargs = require('yargs') const signature = yargs.argv._[0] const process = require('process') patterns.forEach(pattern => { glob.sync(pattern).forEach(file => { const commandPath = path.resolve(file) const command = require(commandPath) if (command.signature == signature) { command.argv = yargs.argv command.run() process.exit() } }) }) console.log('Command not found.')

aquí hay un comando de ejemplo en una de las carpetas de commands :

 const { Sequelize } = require('sequelize') class MigrateCommand { static signature = 'migrate' static argv = {} static run() { const sequelize = new Sequelize({ dialect: 'mysql', host: 'localhost', port: 3306, database: 'dio_unity2', username: 'root', password: '', }) const connect = async () => { try { await sequelize.authenticate() console.log('Connection successful.') } catch (error) { console.error('Unable to connect.', error) } } connect() console.log('migrate run complete') } } module.exports = MigrateCommand

configuré npx para que pueda ejecutar npx unity migrate y llamará a este comando según la firma de migrate

ahora mi consola debería decir que connection successful o unable to connect y luego la ejecución de migrate run complete , pero todo lo que veo en la consola es la migrate run complete . es como si ni siquiera estuviera tratando de conectarse en absoluto...

No tengo idea de lo que estoy haciendo mal aquí.

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

0

No puede hacer que un proceso asincrónico sea sincrónico sin generar un nuevo hilo y esperarlo sincrónicamente. (Hay un paquete npm que hace eso, a través de execSync ).

Pero la buena noticia aquí es que no es necesario en su código. Quiere hacer las cosas en serie , pero hacer las cosas en serie no es lo mismo que hacerlas sincrónicamente . Así es cómo:

En primer lugar, la run no puede hacer que el proceso asíncrono se inicie a través de la authenticate sincrónica. Entonces, en su lugar, la run debería ser async (y no necesitamos connect ):

 static async run() { const sequelize = new Sequelize({ dialect: 'mysql', host: 'localhost', port: 3306, database: 'dio_unity2', username: 'root', password: '', }) try { await sequelize.authenticate() console.log('Connection successful.') } catch (error) { console.error('Unable to connect.', error) } console.log('migrate run complete') }

A continuación, en el script, recorremos sus patrones y archivos usando una función async :

 (async () => { for (const pattern of patterns) { for (const file of glob.sync(pattern)) { const commandPath = path.resolve(file) const command = require(commandPath) if (command.signature == signature) { command.argv = yargs.argv await command.run() // *** Note the `await` process.exit() } } } console.log("Command not found.") })();

Eso hace el trabajo de forma asincrónica, pero uno tras otro (en serie).


Si fuera yo, no usaría process.exit() para finalizar el proceso, es una forma muy agresiva de finalización del proceso que puede evitar que algunas cosas finalicen ( detalles aquí ), y puede no ser tan claro para las personas que hacen código. mantenimiento más tarde como alternativas. Ahora que hemos puesto el código en una función contenedora, simplemente saldría de la función para romper los bucles:

 await command.run(); return;
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