Tengo una función que devuelve una promesa:
const validateForm = () => { return new Promise((resolve, reject) => { // code here takes time return resolve('valid'); }); }Y uso esta promesa de esta manera:
validateForm() .then(function(result) { console.log('form is valid'); }) console.log('line after promise');Espero ver esta salida:
el formulario es valido
línea después de la promesa
Pero veo esta salida:
línea después de la promesa
el formulario es valido
¿Cómo debo corregir este código para obtener el primer resultado? ¿Cómo congelar el código para no ejecutar líneas después de la promesa hasta que la promesa se resuelva o se rechace?
Cuando se usan promesas, todo el código en un "nivel" dado se ejecuta primero, luego se ejecutan async/promises, que luego pueden desencadenar entonces.
1 validateForm() 2 .then(function(result) { 3 console.log('form is valid'); 4 }) 5 6 console.log('line after promise');En su código, esencialmente iría a la línea 1 y 6, luego a la línea 2, 3, 4 cuando se resuelva la promesa.
Está intentando forzar el código asincrónico para que se ejecute de forma sincrónica, lo que simplemente no funciona. Si desea el resultado esperado, todo tiene que estar en un entonces:
validateForm() .then(function(result) { console.log('form is valid'); }).then(function () { console.log('line after promise'); });O podría estar en el mismo entonces() justo en la siguiente línea. Pero no puede estar simplemente ahí fuera.
O podría confundirse al ver cosas que usan async/await. Si está en una función asíncrona, puede hacer:
await validateForm() .then(function(result) { console.log('form is valid'); }) console.log('line after promise');Lo cual es básicamente azúcar sintáctico para lo anterior (aunque tiende a ser la preferencia de las personas, incluida la mía).