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

173
Vistas
La función asíncrona no ejecuta algún código incluso dentro de espera

Tengo una función Node.js AWS Lambda creada a través del marco sin servidor. Tengo múltiples funciones auxiliares dentro de él. Tengo un problema con uno de ellos debido a que es asíncrono. La función se ejecuta y cierra la sesión de todas las partes junto a las que pongo comentarios, sin embargo, no actualiza callDuration . Creo que el código tiene un problema debido a la sincronización donde termina en el orden incorrecto. Mi objetivo es poder devolver la callDuration de la llamada a mi función principal para su posterior procesamiento. ¿Cómo puedo hacer que todo el código se procese/ejecute y pueda cumplir mi objetivo y hacer que el código se ejecute en el orden correcto?

Aquí está la función:

 const callAggregate = async (billingData, billingDB) => { const accountSid = process.env.TWILIO_ACCOUNT_SID const authToken = process.env.TWILIO_AUTH_TOKEN const client = require('twilio')(accountSid, authToken) // Setup model const Billing = billingDB.model('Billing') await Billing.findOne({_id: billingData._id}).exec().then(bill => { const callArray = bill.callSid console.log(bill) // This logs out let callDuration = 0 for (const call of callArray) { console.log(call) // This logs out client.calls(call) .fetch() .then(callDetails => { console.log(callDetails) // This logs out callDuration += callDetails.duration }) } console.log(`Billing for ${callDuration} minutes of voice calling for ${billingData._id}`) // This logs out Billing.findOneAndUpdate( {_id: billingData._id}, { $inc: { call_duration: callDuration }, callSid: []}, (err, doc) => { if(err) { console.log(err) } } ) return callDuration }) }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Este es un caso de mezclar y combinar promesas con devoluciones de llamadas simples y mezclar await con .then() , los cuales dificultan la gestión adecuada del control de flujo y el manejo de errores.

Dentro de su función, que es async y usa await en algunos lugares, también tiene una promesa que no está esperando (lo que significa que se ejecuta en bucle abierto y nada lo espera) y tiene una función de base de datos que usa una devolución de llamada simple, no la interfaz de promesa para que nada lo espere tampoco.

Más específicamente, nada está esperando esto:

 client.calls(call).fetch()

Entonces, debido a que no esperó a que terminara .fetch() , estaba intentando usar la variable callDuration antes de que el código terminara de modificar esa variable (dándole el valor incorrecto).

Del mismo modo, tampoco hay nada esperando a que se Billing.findOneAndUpdate(...) .

Una solución limpia es cambiar todo a promesas y await . Esto implica usar solo promesas con su base de datos (sin simples devoluciones de llamada) y convertir los .then() en await .

 async function callAggregate(billingData, billingDB) { const accountSid = process.env.TWILIO_ACCOUNT_SID const authToken = process.env.TWILIO_AUTH_TOKEN const client = require('twilio')(accountSid, authToken) // Setup model const Billing = billingDB.model('Billing') let bill = await Billing.findOne({ _id: billingData._id }).exec(); const callArray = bill.callSid console.log(bill) // This logs out let callDuration = 0 for (const call of callArray) { console.log(call) // This logs out let callDetails = await client.calls(call).fetch(); console.log(callDetails) // This logs out callDuration += callDetails.duration } console.log(`Billing for ${callDuration} minutes of voice calling for ${billingData._id}`) // This logs out let doc = await Billing.findOneAndUpdate({ _id: billingData._id }, { $inc: { call_duration: callDuration }, callSid: [] }).exec(); return callDuration }
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