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

259
Vistas
Java Script - Manejo de errores en async/await

Soy nuevo en javascript y estaba aprendiendo sobre async/await. Estudié a través de diferentes documentos y obtuve una idea básica. Mientras ejecutaba algún ejemplo, me enfrenté a un resultado inesperado. No estoy seguro de dónde me perdí.

Código:

 var colors = ["RED", "GREEN", "YELLOW"]; const getColor = async () => { var value = ""; colors.forEach((color) => { value = value + color + " "; }); return value; }; const middleware = async () => { addColor(null) .then(() => { getColor().then((result) => { console.log(result); }); }) .catch((err) => { console.log(err.message + " at middleware"); }); }; const addColor = async (color) => { validateColor(color) .then(() => { console.log("Adding data"); colors.push(color); }) .catch((err) => { console.log(err.message + " at add color"); throw err; }); }; const validateColor = async (color) => { if (color == null) { throw new Error("Color cannot be empty"); } }; middleware();

Después de llamar a la función de middleware, el resultado esperado era imprimir sólo el mensaje de error. Pero también imprime el nombre de los colores. Producción:

ingrese la descripción de la imagen aquí

No puedo entender por qué se ejecutó el código dentro de then() a pesar de que addColor() arroja algún error. Además, ¿por qué no se llama al bloque catch en middleware() ?

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

0

Tanto validateColor() como addColor() crean objetos Promise, pero no están relacionados. Si se addColor() para devolver la Promesa de validateColor() , su código funciona como espera:

 var colors = ["RED", "GREEN", "YELLOW"]; const getColor = async () => { var value = ""; colors.forEach((color) => { value = value + color + " "; }); return value; }; const middleware = async () => { addColor(null) .then(() => { getColor().then((result) => { console.log(result); }); }) .catch((err) => { console.log(err.message + " at middleware"); }); }; const addColor = async (color) => { return validateColor(color) .then(() => { console.log("Adding data"); colors.push(color); }) .catch((err) => { console.log(err.message + " at add color"); throw err; }); }; const validateColor = async (color) => { if (color == null) { throw new Error("Color cannot be empty"); } }; middleware();

Sus funciones async dan como resultado que el valor de retorno se envuelva en una Promesa. Por lo tanto, tanto validateColor() como addColor() , a menos que haga algo al respecto, crearán objetos Promise individuales separados que no tienen nada que ver entre sí. Por otro lado, si addColor devuelve la Promesa que devuelve validarColor validateColor() , entonces no se creará una nueva Promesa separada; la misma Promesa se devuelve al middleware() . Esa promesa tiene la excepción pendiente lanzada en validateColor() , por lo que se llamará a .catch() .

about 4 years ago · Juan Pablo Isaza Denunciar

0

En un trazador de líneas, diría que debe agregar la promesa de devolución para cada función asíncrona aquí es el código correcto.

 var colors = ["RED", "GREEN", "YELLOW"]; const getColor = async () => { var value = ""; colors.forEach((color) => { value = value + color + " "; }); return Promise.resolve(value); }; const middleware = async () => { return addColor(null) .then(() => { getColor().then((result) => { console.log(result); }); }) .catch((err) => { console.log(err.message + " at middleware"); }); }; const addColor = async (color) => { return validateColor(color) .then(() => { console.log("Adding data"); colors.push(color); }) .catch((err) => { console.log(err.message + " at add color"); throw err; }); }; const validateColor = async (color) => { if (color == null) { throw new Error("Color cannot be empty"); } Promise.resolve(true) }; middleware();

Explicación:

Básicamente, la función asíncrona se puede usar con esperar, o en otras palabras, puede decir si desea usar esperar con cualquier función, entonces la función debe ser asíncrona, lo que significa que la función debe devolver una promesa, entonces solo puede esperar la declaración puede estar justificado.

Ejemplo:

Considere que estoy llamando a una función "prueba ()" y "esperar prueba ()", por lo que la diferencia entre esos dos es en el primer caso ("prueba ()") llamará a la función de prueba y si hay alguna operación de bloqueo, entonces continuará con la ejecución de sentencias debajo de la sentencia “test()”. Mientras que en el caso de "esperar prueba ()", si hay una operación de bloqueo, esperará a que se complete y no ejecutará las declaraciones adicionales hasta que se complete la función de prueba (aquí completada significa que la función devolverá una promesa y esperará hasta que la promesa sea resuelta o rechazada)

Entonces, aquí ninguna de las funciones asíncronas devuelve una promesa, por lo que, de forma predeterminada, a medida que la ejecución de la función supera, se considera resuelta y, por lo tanto, surge el problema.

Explicación detallada con respecto a este ejemplo.

Se llama a la primera función “middleware()”. Desde esa función "addColor ()" se llama

añadirColor():
si la promesa de retorno de esta función se resuelve, llamará a la función "getColor ()"
De lo contrario, simplemente imprimirá un mensaje de error.

Entonces, primero irá a la función addColor dentro de esa función a la que llamamos función validateColor()

validarColor():
Si el retorno prometido de esta función se resuelve, estamos agregando el color a la matriz.
De lo contrario, imprimimos un error y lo lanzamos.

Y la función de validación de color arroja un error porque el color es nulo, pero cuando llega a otra parte de la función de validación (que se llama desde la función addColor), la función addColor ya se considera que la ejecución se realizó correctamente.

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