En el siguiente código tengo createPost() dentro de una función async , pero no quiero usar await en ella, por lo que bloquea la ejecución del resto de la función. Es por eso que usé then .
La función async externa tiene muchas otras funciones que usan await , por lo que no se puede cambiar.
Pregunta
Dado que createPost() es una función async / await (ver más abajo). ¿Cómo puede resolver/rechazar then / catch en la función externa?
module.exports = async (p) => { // lots of code here const t = await function1(); // lots of code here createPost(p).then(message => { // lots of code here console.log("ok " + message); }).catch(message => { console.log("failed " + message); }); };crearPost()
module.exports = async (p) => { // lots of code here try { const r = await getStat(); } catch (error) { console.log(error); }; };async / await es un equivalente más moderno a .then / .catch .
En este caso has mezclado las sintaxis de ambos.
No necesita bloques try / catch cuando usa .then ,
al igual que no necesita declarar una función como async cuando usa la sintaxis try / catch .
Aparte de eso, no hay razón para que no puedan trabajar juntos en funciones separadas.
module.exports = (p) => { createPost(p).then(message => { console.log("ok " + message); }).catch(message => { console.log("failed " + message); }); }; createPost():
module.exports = async (p) => { try { const r = await getStat(); } catch (error) { console.log(error); }; };Una declaración async en una función es redundante e incorrecta si no está utilizando la palabra clave await en su interior.
await/async a menudo se denomina azúcar sintáctico, y nos permite esperar algo (por ejemplo, una llamada API), lo que nos da la ilusión de que es sincrónico en un código asincrónico real, lo cual es un gran beneficio.
Las cosas que desea lograr con async/await son posibles con promesas, pero las ventajas de async/await. vamos a un ejemplo con este código:
const makeRequest = () => //promise way getJSON() .then(data => { return data }) makeRequest(); const makeRequest = async () => { //async await way const data = await getJSON(); return data; } makeRequest()¿Por qué se prefiere async/await a la promesa?
Conciso y limpio : no tuvimos que escribir .then y crear una función anónima para manejar la respuesta, o dar un nombre de datos a una variable que no necesitamos usar. También evitamos anidar nuestro código. async/await es mucho más limpio.
Manejo de errores : Async/await finalmente permite manejar errores sincrónicos y asincrónicos con el mismo formato de prueba/captura.
Depuración : una ventaja realmente buena cuando se usa async/await es que es mucho más fácil depurar que prometer por 2 razones: 1) no puede establecer puntos de interrupción en funciones de flecha que devuelven expresiones (sin cuerpo). 2) si establece un punto de interrupción dentro de un bloque .then y usa accesos directos de depuración como step-over, el depurador no se moverá al siguiente .then porque solo "pasos" a través del código síncrono.
Pilas de errores: la pila de errores devuelta de la cadena de promesas no nos da idea de dónde ocurrió el error y puede ser engañosa. async/await nos da la pila de errores de async/await apunta a la función que contiene el error, lo cual es una gran ventaja.