No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Promesas

9/31
Recursos

Aportes 161

Preguntas 24

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

nominado a profesor del año junto con leonidas!!

solo a ti te creo las promesas

Las promesas son una sintaxis mas elegante y legible de realizar callbacks, creando así un código mucho más escalable y entendible para todas las personas.
Una promesa al final no deja de ser un callback, solo que, con la novedad de tener estados, las promesas cuentan con 3 estados, resuelta, en progreso y en fallo.
Para utilizar una promesa solo debemos de instanciar una nueva, una promesa en si es una función que recibe dos parámetros, resolve y reject, que son los dos estados de una promesa.
Utilizamos resolve para retornar el valor deseado cuando una función se ejecute y utilizamos reject para cuando una función retorna un valor no deseado.
New Promise( (resolve, reject) => {
…code
If(code === true){
resolve(correctValue);
}else {
Reject(wrongValue);
}
});
Para poder obtener los valores que retorna una función debemos utilizar su propiedad .then, esta propiedad es una función que recibe un callback el cual tendrá como parámetro el valor retornado con resolve o reject.
Siempre que usemos una promesa además de realizar la propiedad .then debemos invocar la propiedad .catch, la cual es un callback que recibe como parámetro el error ocurrido en caso de haber sucedió uno.

myPromise(‘Parameter’)
.then( data => console.log(data) )
.catch( err => console.log(err) );

RESUMEN:


Las promesas vienen de los callbacks, pero las promesas lo que hacen es dar un estado.
Las promesas son una “clase” global que podemos llamar de donde sea, nuestras funciones devuelvan promesas
Promise(), la diferenia entre promises y callbacks es la capacidad de anidar promesas. Formando una cadena de promesas.
Es muy útil para visualizar código asíncrono de manera síncrona.



function hola(nombre) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log('Hola, '+ nombre);
            resolve(nombre);
        }, 1500);
    });
    
}

function hablar(nombre) {
    return new Promise( (resolve, reject) => {
        setTimeout(function() {
            console.log('Bla bla bla bla...');
            //resolve(nombre);
            reject('Hay un error');
        }, 1000);
    });
}

function adios(nombre) {
    return new Promise( (resolve, reject) => {
        setTimeout(function() {
            console.log('Adios', nombre);
            resolve();
        }, 1000);
    });
}

// ---

console.log('Iniciando el proceso..');
hola('Alejandro')
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(adios)
    .then((nombre) => {
        console.log('Terminado el proceso');
    })
    .catch(error => { // Hace parte de a sintaxis de las promesas puedo captar los reject
        console.error('Ha habido un error:');
        console.error(error);
    })

“Recuerda, esto es nodejs, es com Mad Max, todo puede fallar”. 💻

Bueno antes de que comience el video quiero recomendar este canal dé YouTube, me parece de los mejores junto con el buen Sasha

https://www.youtube.com/watch?v=5XyzLfPBpZs

Les comparto el código de la clase.

Promesas, forma de trabajar con asincronia, las promesas pueden tene run estado, resultas, no resuletas, fallar.
Son una clase global.
Las promesas se pueden ir anidados.
Siempre que se use un THEN, debe ser acompañado de un manejador de errores CATCH.
Ejemplo del mismo código con promesas pero se obtiene el mismo resultado en consola.

//funciones
//se crea una promesa que indica el estado del proceso.
//en vez de devolver callback se usara promesa
function hola(nombre){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            console.log('hola, '+nombre);
            resolve(nombre);
        },1000);
    });
}
function hablar(nombre) {
    return new Promise((resolve,reject)=>{
        setTimeout(function () {
            console.log('bla bla bla bla...');
            resolve(nombre);
        },1000);
    });
}
function adios(nombre) {
    return new Promise((resolve,reject)=>{
        setTimeout(function () {
            console.log('adios',nombre);
            resolve(nombre);
        },1000);
    });
}

//lo que se ejecutara....
console.log('Iniciando el Proceso...')
hola('Alexis')
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(adios)

    .then((nombre)=>{
        console.log('Terminando Proceso');
    })

//cualquier hilo de ejcucion lo llevará al catch para ejecutar su funcion
//console
    .catch(error =>{
        console.error('ha habido un error');
        console.error(error);
    })```

Cada vez que veo las Promesas flipo en colores. Son súper simples y tienen un potencial enorme. Después de algún tiempo de verlas y practicarlas logro entenderlas cuando las veo aplicadas. Pero aún me cuesta horrores entender cuándo usarlas y hacerlo bien. A seguir practicando 😄

hice el ejercicio con funciones recursivas, funciona pero no se que tan optimo sea por si le quieren echar un ojo

const nombre = process.env.NOMBRE || 'Extraño'
const TIME = 1000
const repeticiones = 4

const hola = (Nombre)=> {
      return new Promise((resolve, reject)=>{
            setTimeout( () => {
                  console.log('hola, ' + Nombre)
                  resolve(nombre)
            },TIME)
      })
      
}
const hablar = (nombre) => {
      return new Promise((resolve, reject) => {
            setTimeout(() => {
                  console.log('Bla bla bla bla ....')
                  resolve(nombre)
            },TIME)
      })
}
const adios = (nomb) => {
      return new Promise( (resolve,reject) =>{
            setTimeout( () => {
                  console.log('Adios ' + nomb + '....')
                  resolve(nomb)
            },TIME)
      })
}
const conversacion = (nombre, repeticion) =>{
      return new Promise((resolve, reject) => {
            if(repeticion>0){
                  setTimeout( () =>{
                        conversacion(nombre, --repeticion)
                              .then(hablar(nombre))
                              .catch(error => {
                                    console.error('ah habido un error')
                                    console.error(error)
                              })
                  }, TIME)
            }else{
                  setTimeout(()=>{
                        adios(nombre)
                        .then(() => {
                              console.log("terminado el proceso")
                        })
                        .catch(error => {
                              console.error('ah habido un error')
                              console.error(error)
                        })
                  },TIME)
            }
      })
}

console.log("inciando el proceso...")
hola(nombre)
      .then(conversacion(nombre,repeticiones))
      .catch(error => {
            console.error('ah habido un error')
            console.error(error)
      })

5 cursos y no entendia del todo las promesas, llega este profe y a la primera :v

Cabe mencionar que para acceder al nombre en adios
el param se debe mandar a traves de todos las promesas

hola('Adranuz')
  .then(hablar)
  .then(hablar) 
  .then(hablar)
  .then(hablar)
  .then(adios)
  .then((nombre)=> {
    console.log('Proceso terminado')
  })
  .catch (error=> {
    console.log('Ocurrio un error')
    console.error(error)
  }) 

Manejar callbacks puede ser un infierno, para evitarlo se crearon las promesas, que son como callbacks pero cambiaron un concepto. Agregaron el estado, pueden estar resueltas, no resueltas, pendientes o fallar.

Lo que haremos es que nuestras funciones en vez de ejecutar cosas mejor devuelvan la promesa y quien las llame esten pendientes del estado y lo que pasa.

return new Promise((resolve, reject) => {});

Lo que va a tener es un callback, ya que al final siempre es una funcion asincrona. Esta funcion recibe dos parametros, resolve y reject. Nos van a permitir resolver la promesa o si detectamos un error lo que se va a detener. Ya no ejecutaremos un callback, en vez de eso mandaremos RESOLVE. Nuestra funcion de hola quedaria:

const hola = (nombre) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(`Hola ${nombre}`);
      resolve(nombre);
    }, 1500);
  });
};

Ahora para ejecutar nuestro metodo podriamos usar:

console.log("Iniciando el proceso");
hola("Carlos")
	.then((nombre) => {
  console.log("terminado el proceso");
});

Donde veremos que al solucionarle mandaremos por then el parametro qie mandamos desde el inicio y este se ejecutara. La diferencia es que podemos ir anidando promesas, opor ejemplo, el metodo adios vamos a retornar una promesa:

const adios = (nombre) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(`Adios, ${nombre}`);
      resolve();
    }, 1000);
  });
};

Ahora para que esta se pueda llamar usamos:

hola("Carlos")
  .then(adios)
  .then((nombre) => {
    console.log("terminado el proceso");
  });

Ahora podremos trabajar con nuestras funciones de forma mucho mas sencilla. ya que si solo queremos pasar el valor y no utilizarlo podemos usar:

console.log("Iniciando el proceso");
hola("Carlos")
  .then(hablar)
  .then(adios)
  .then((nombre) => {
    console.log("terminado el proceso");
  });

Y ya cada que queramos hablar solo tenemos que duplicar el hablar y asi podremos ver de forma mas legible todo.

Pero que pasa si tenemos un error? Pues para eso tenemos el REJECT donde por si falla podemos decirle que mande los parametros al error:

const hablar = (nombre) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Bla Bla bla");
      //   resolve(nombre);
      reject("Hay Un error");
    }, 1000);
  });
};

Y ahora pondremos un catch que estara para asegurarse de que nuestro programa no falle y si falla recibir el error

console.log("Iniciando el proceso");
hola("Carlos")
  .then(hablar)
  .then(adios)
  .then((nombre) => {
    console.log("terminado el proceso");
  })
  .catch((error) => {
    console.error(error);
  });

Siempre que hagamos un THEN o hagamos una promesa tenemosq ue tener un catch para evitar que se propague y este se detenga y se envie a produccion. Todo puede fallar pero siempre con tus THEN y usar CATCH PARA SOBREVIVIR

Siempre promesas ❤️

El then de una promesa puede recibir dos parametros: onSuccess y onError, pero tengan en cuenta para el examen que como solo se explico que se pasaba uno, entonces la respuesta sera UNO.

Primera ves tocando el backends despues de un buen tiempo con el fronted, aquí voy !

Fullstack MERN COÑOO !!!

Todos los cursos de éste excelente profesor, necesitamos más!!

function hello(name) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("hello", name);
      // resolve();
      reject("Error");
    }, 1500);
  });
}

function speaks(name) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("bla bla bla...");
      resolve(name);
    }, 1000);
  });
}

function bye(name) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("bye", name);
      resolve();
    }, 1000);
  });
}

/** Execute */
console.log("Init process...");
hello("George")
  .then(speaks)
  .then(speaks)
  .then(speaks)
  .then(speaks)
  .then(bye)
  .then(() => console.log("End process"))
  .catch((error) => console.log("Error", error));

I love Async/await, ahhh y tambien las promesas 😛

De todas las explicaciones en el camino del JS Challenge, acerca de este tema, me quedo con esta 😃

Promesas: Tenemos que pensar las promesas como valores que aun no conocemos. Es la promesa de que ahi va a haber un valor cuando una acción asincrona suceda y se devuelva.

Ahora entiendo lo que me pasó, no le puse catch a las promesas de ella v;

Aparte de los métodos .then y .catch existe .finally que ejecutara hasta el final lo que se le pase por parámetro, sin importar si se resuelve o si falla la promesa.
Ejemplo:

  • Sin finally:
hola(‘Abner’)
  .then(hablar)
  .then(hablar)
  .then(adios)
  .then((nombre)=>{
    console.log(‘Proceso terminado’);
  })
  .catch(error =>{
    console.error(‘ha habido un error’);
    console.error(error);
  })

  • Con finally:
hola(‘Abner’)
  .then(hablar)
  .then(hablar)
  .then(adios)
  .catch(error =>{
    console.error(‘ha habido un error’);
    console.error(error);
  })
  .finally(()=>{
    console.log(‘Proceso terminado’);
  })
  • Resultado resuelto:
Iniciando el proceso…
Hola, Abner
Bla Bla Bla Bla Bla Bla …
Adios, Abner
Proceso terminado
  • Resultado fallado:
Iniciando el proceso…
Hola, Abner
Bla Bla Bla …
Ha habido un error: Hay un error
Proceso terminado

Promesas

Si nos encontramos con un callback hell debemos refactorizarlo y esto implica cambiar su sintaxis, en este caso con promesas resolveremos el problema.

function despertar(nombre) {
  return new Promise((resolve, reject) => {
    if(true) {
          setTimeout(() => {
      console.log(`${nombre} desperto`);
      resolve(nombre);
    }, 1000);
    } else {
      reject(new Error(`${nombre} no desperto`))
    }
  });
};

const vivio = (nombre) => {
  return new Promise((resolve, reject) => {
    if(true) {
      setTimeout(() => {
        console.log('Hicimos toda clase de cosas');
        resolve(nombre)
      }, 1000)      
    } else {
      reject( new Error(`${nombre} no hizo nada =(`))
    }
  })
};

function dormir(nombre) {
  return new Promise((resolve, reject) => {
    if(true) {
      resolve(nombre);
    } else {
      reject(new Error(`${nombre} no se ha dormido`));
    }
  })
};

despertar("Manuel")
  .then(vivio)
  .then(vivio)
  .then(dormir)
  .then(() => {
  console.log("Termino");
})
  .catch(error => {
    console.error(`Algo fallo ${error}`)
  });

Lo que hicimos en el código anterior es crear una función que retorna una promesa la cual recibe dos parametro que son resolve y reject, resolve es igual a promesa resuelta y reject la promesa falló.

luego hacemos el llamado de la función inicial que es despertar("Manuel") y dentro ponemos el argumento. A continuación con los .then() llamamos las otras promesas necesarias y por ultimo capturamos los posibles errores con el fin de no propagarlo.

Llevo meses aprendiendo cosas nuevas con Js,soy un novato y es la primera vez que alguén explica claramente este tema de las promesas y asincronismo.

You are the best ❤️

HE aqui mi codigo!

function hola(n) {
    return new Promise( (resolve, reject) => {
        setTimeout( () => {
            log('Hola '+n)
            resolve(n);
        },1000) 
    })

}
function hablar(n) {
    return new Promise( (resolve, reject) => {
        setTimeout(() => {
            log('BLA bla BLA');  
            resolve(n);  
        }, 1000);
    })
}

function adios(n) { 
    return new Promise( (resolve, reject) => {
        setTimeout(() => {
            log('Hemos terminado de ejecutar el proceso mi compa ' + n);  
            resolve(n);  
        }, 1000);

    })
}

function log(str) {
    console.log(str);
}
log('Inciando proceso');
hola('carlos')
    .then(hablar)
    .then(adios)
    .then((n) => log(n +'! Proceso terminado'))
    .catch( e => {
        log('Compa ocurrio un error!!!');
        console.log(e);
    } )```

Yo lo entendí haciendo un ejemplo un poco más sencillo. Obviamente ya podríamos escalarlo a algo mucho más grande, pero esto me funciono a mí.

function thisIsAPromise(age, topAge){
	return new Promise((resolve, reject) => {
		if (age <= topAge){
			resolve('User is allowed.')
		} else {
			reject('User is denied.')
		}
	})
}
// Ejemplo permitido
thisIsAPromise(5, 15).then((mensaje) => {
	console.log(mensaje);
}).catch(function(mensaje){
	console.log(mensaje);
})
thisIsAPromise(20, 15).then((mensaje) => {
	console.log(mensaje);
}).catch(function(mensaje){
	console.log(mensaje);
})

Casi como MAD MAX, que accurate XDD

“Recuerda que estamos en Node y esto es como Mad Max, todo puede petar en cualquier momento y romperse el proceso entero, si utilizas promesas, nunca olvides colocar CATCH”

Es genial este profesor! Ja…

¿Existe alguna diferencia en usar function() {} a usar () => {} una arrow function?

Hola, Creo que he encontrado un error debe ser por el tipeado de Javascript, cuando realizaba el mismo código me resultaba NaN, borre la sección y volví a escribir ese fragmento y funciono

¡Grande Carlos! Qué analogía tan original, jamas pensé que alguien comparara Node con Mad Max. 🤯

Venga, esas promesas las vi en el curso de fundamentos de javascript, vamos a practicarlas de nuevo 😄

Promesas

Una Promise o promesa, es un objeto que representa la terminación o el fracaso de una operación asíncrona.
Esencialmente, una promesa es un objeto devuelto al cual se adjuntan funciones callback, en lugar de pasar callbacks a una función.

Las promesas en Javascript se representan a través de un object, y cada promesa estará en un estado concreto: pendiente, aceptada o rechazada.

Además, cada promesa tiene los siguientes métodos, que podremos utilizar para utilizarla:

Ejemplo de promesas

myFunction1 = (nombre) => {
    const promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Hola, ' + nombre);
        }, 1000);
    });
    return promise;
}

myFunction2 = () => {
    const promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Bla bla bla bla bla bla...');
            // reject(new Error("Esto es un error inducido!"));
        }, 1000);
    });
    return promise;
}

myFunction3 = (nombre) => {
    const promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Adios, ' + nombre);
        }, 1000);
    });
    return promise;
}

console.log('Iniciando proceso');
let nombre = 'German';

// Opcion 1 para ejecutar una promesa
myFunction1(nombre).then((resPro1) => {
    console.log('resPro1: ', resPro1);
    return myFunction2(); 
}).then((resPro2) => {
    console.log('resPro2: ', resPro2);
    return myFunction2(); 
}).then((resPro2) => {
    console.log('resPro2: ', resPro2);
    return myFunction2(); 
}).then((resPro2) => {
    console.log('resPro2: ', resPro2);
    return myFunction3(nombre); 
}).then((resPro3) => {
    console.log('resPro3: ', resPro3);
    console.log('Terminado el proceso!'); 
}).catch((err) => {
    console.log('err: ', err);
});

// Opcion 2 para ejecutar una promesa con ECMAscript
const promise1 = myFunction1(nombre);
const promise2 = myFunction2();
const promise3 = myFunction3(nombre);
const arrayPromises = [
    promise1, 
    promise2, // Promesa para hablar
    promise2, // Promesa para hablar
    promise2, // Promesa para hablar
    promise2, // Promesa para hablar
    promise2, // Promesa para hablar ..... Podemos seguir agregando esta promesa al array
    promise3
];
Promise.allSettled(arrayPromises).then((response) => {
    console.log('response: ', response);
    response.forEach((value, key) => {
        console.log('response '+ key +': ', value['value']);
    });
});

Excelente esta explicacion de las promesas

Mi resumen de las promesas:
Producing code - es un código que puede llevar algún tiempo
Consuming code - es un código que debe esperar el resultado
/*=========================================================================*/
Una promesa contiene tanto el Producing code y las llamadas del Consuming code

let myPromise = new Promise( (resolve, reject) => {
    // "Producing Code" (puede tomar tiempo)       
        resolve(); // cuando tiene éxito
        reject();  // cuando hay un error
});
    
    // "Consuming Code" (Debe esperar que se termine la promesa)
    myPromise.then(
      function(value) { /* código si tiene éxito */ },
      function(error) { /* código si hay error */ }
    );

El argumento .then() tiene dos callbacks, uno para éxito y otro para fallo. Ambos son opcionales, puedes agregar solo uno de los dos callbacks.

Ejemplo practico

let example1 = new Promise( (resolve, reject) => {

    //Cambia el valor de x para ver un error
    let x = 0;

    if (x == 0) {
        resolve('ok'); // cuando tiene éxito
    } else {
        reject('error'); // cuando hay un error
    }        
});
    
    // "Consuming Code" (Debe esperar que se termine la promesa)
    example1.then(
      (value) => {console.log(value)},
      (error) => {console.log(error)}
    );
//Promise

// return new promise, es un tipo de funcion para node js que nos ayuda a capturar funciones que funciones y las cuales no lo hacen. Con los respectivos resolve y reject.

function Hello_P(name){
    return new Promise (function (resolve, reject){
        setTimeout(function() {
            console.log('Hello, ' + name);
            resolve(name);
        },1000);
        // Se utiliza en una zona la cual llegue el programa al fallar.
        // Reject('Hay un error?)
    });
}

function Conversation_P(name) {
    return new Promise ((resolve, reject) => {
            console.log('Bla Bla Bla..');
            resolve(name);
    });
}

function Goodbye_P(name){
    return new Promise (function (resolve, reject){
        setTimeout(function() {
            console.log('Goodbye, ' + name);
            resolve();
        },1000);
    });
}

//Importante destacar a la hora de ejecutar las funciones, las variables declaradas por un anterior funcion, sirven, pero si es que ya paso una mas, ademas
//de la funcion declarada, se pierden las variables. Tener encuenta el retorno de variables.

console.log('The process was started');
Hello_P('Owen')
// .then es la forma en la que se ejecutan otras funciones ligadas a la primera para sincronizarlas
    .then(Conversation_P)
    .then(Conversation_P)
    .then(name => {
        return Goodbye_P(name);
    })
    .then(() => {
        console.log('The process was finished');
    })
    // .catch sirve para encontrar los errores reconocidos por reject.
    .catch(error => {
        console.log('Theres an error');
        console.log(error);
    })


¿Qué es una Promise?
Una Promise en JavaScript es un objeto que representa la eventual finalización, o fallo de una operación asíncrona, y su valor resultante.


Una promise recibe una "función ejecutora" que acepta dos argumentos: resolve y reject
¿Cómo funciona?
La “función ejecutora” de Promise es llamada antes que el constructor de Promise retorne el objeto creado. El objetivo de resolve y reject es, como el nombre indica, resolver y rechazar la promise, respectivamente. Pensa que la idea es poder utilizar Promise en tareas asíncronas, y cuando esta tarea se finalice se llame a resolve si todo correcto, o a reject si ha habido algún error.

La pregunta 8 esta equivocada.
En la informacon de MDN dice claramente que then reciben 2 parametros: success y error. Sim embargo sale como respuesta incorrecta.

Pregunta de examen:
¿Cuántos parámetros puede recibir el then de una promesa?

Ya habia visto una clase de Promesas durante el JS Challenge pero me quedo con esta explicación ahora comprendo mejor como poderlas utilizar

Casi un mes sin estudiar, pero volvemos con todo!!

La ventaja que tienen las promesas respecto a los callbacks clásicos es que podemos saber el estado de ejecución de una promesa

Como nos dijo sasha.
Una Promesa se encuentra en uno de los siguientes estados:

function hola(nombre, micallback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (true) {
        console.log(`hola ${nombre}`);
        resolve(nombre);
      } else {
        reject("Error al saludar");
      }
    }, 1000);
  });
}

function hablar(nombre) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (true) {
        console.log("bla bla bla bla");
        resolve(nombre);
      } else {
        reject("Error encontrado al hablar");
      }
    }, 500);
  });
}

function adios(nombre, otrocallback) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (true) {
        console.log(`Adios ${nombre}`);
        resolve();
      } else {
        reject("error al despedirse");
      }
    }, 2000);
  });
}

function conversacion(nombre, veces, callback) {
  if (veces > 0) {
    hablar(() => {
      conversacion(nombre, --veces, callback);
    });
  } else {
    adios(nombre, callback);
  }
}

//-----------------

//callback hell

console.log("iniciando el proceso..");
hola("Camilo")
  .then(hablar)
  .then(hablar)
  .then(hablar)
  .then(hablar)
  .then(adios)
  .then((nombre) => {
    console.log("terminado el proceso");
  })
  .catch((error) => {
    console.error("ha habiado un error");
    console.error(error);
  });

function hola(nombre) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log("Hola, " + nombre);
            resolve(nombre);
        }, 1500);
    });
    
}

function adios(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout( function() {
            console.log("Adios",  nombre);
            resolve();
        }, 1000);
    });
    
}

function hablar(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            console.log("Bla bla bla...");
            //resolve(nombre);
            reject('Hay un error');
        }, 1000)
    });
    
}

function conversacion(nombre, veces, callback) {
    if (veces > 0) {
        hablar(function() {
            conversacion(nombre, --veces, callback);
        });
    }
    else {
        adios(nombre, callback);
    }
}

// --
console.log('Iniciando el proceso..');
        
hola('Carlos')
    .then(hablar)
    .then(adios)
    .then((nombre) => {
        console.log('Terminado el proceso');
    })
    .catch(error => {
        console.log('Ha habido un error:');
        console.log(error);
    })```

Las promesas se pueden concatenar, y en la concatenacion se puede definir un catch para atrapar cualquier ocurrido en la cadena de promesas.

function hola(nombre){
    return new Promise(function(resolve, reject){
        setTimeout(()=>{ 
            console.log(`Hola ${nombre}`);
            resolve(nombre);
    }, 1000);
    });
}

function adios(nombre){
    return new Promise(function(resolve, reject){
        setTimeout(()=>{ 
            console.log(`Adios ${nombre}`);
            resolve(nombre);
    }, 1000);
    });
}

function hablar(nombre){
    return new Promise(function(resolve, reject){
        setTimeout(()=>{ 
            console.log(`Bla bla bla`);
            reject('Fallo')
            //resolve(nombre);
    }, 1000);
    });
}

hola("JL")
.then(hablar)
.then(hablar)
.then(hablar)
.then(adios)
.then(()=>{
    console.log("Proceso terminado");
}).catch((error)=>{
    console.error("Error: ", error);
});

Promesas es una manera nueva de hacer un código síncrono. Una promesa se crea de la siguiente manera:

function compararParametros (param1, param2) {
	return new Promise ((resolver, reject) => {
		if(param1 === param2) {
			console.log("Hola Soy una promesa y mís parametros son exactamente iguales")
			resolve(true)
		} else {
			console.log("Hola Soy una promesa y mís parametros son  diferentes")
			reject(false)
		}
	})
}

En vez de hacer tantos .then() puedes user un Promiseall() asi:

const saludar = (nombre) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log("Hola ".concat(nombre))
            resolve(nombre)
            reject('uupssss')
        }, 1000)
    })
}


const hablar = (veces) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log("Bla bla bla bla ...\n".repeat(veces))
            resolve(veces) // debemos pasarle el valor del parametro nombre para no perderlo entre las ejecuciones seguidas del .then()
        }, 1000)
    })
}

const adios = (nombre) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log("Adios ".concat(nombre))
            resolve(nombre)
        }, 1000)
    })
}


console.log('Iniciando proceso! \n')
Promise.all([saludar('Daniela'), hablar(3), adios('Daniela')]).then((values) => {
    console.log(values);
});

Qué clase tan genial! De todos los cursos de Platzi en los que he visto asíncronismo, es el único con el que al final puedo decir que lo entendí.

Creo que el que lo explique con funciones sencillas y no con WebRequest o llamadas a APIs, me facilita mucho la comprensión de este tema.

Me quedo claro el tema pero en la función de adios me aparece undifined el nombre y no se que pueda ser.

function hola(nombre){

    return new Promise(function(resolve, reject){
        setTimeout(function (){
            console.log('Hola ' + nombre)
            resolve();
        },1000);
     


    });
     
    
   
    }

function hablar(nombre){
    return new Promise (function(resolve, reject){
        setTimeout(function(){
            console.log('Como estas');
            resolve();
        },1000);

    })
    

    }

    function adios(nombre){

        return new Promise(function(resolve, reject){
            setTimeout(function (){
                console.log('adios', nombre)
                resolve();
            },1000);
         
    
    
        });
         
        
       
        }

    console.log('Inicio del proceso...');

    hola('Luis')
        .then(hablar)
        .then(adios)
    
        .then((nombre)=>{


            console.log('Terminado el proceso');

        })
        .catch(error =>{
            console.log('tenemos un error');
            console.error(error);
            

        })
        

alguien me explica porque cuando en la funcion q coloco en tiempo de espera en el setimeout en 1000 me devuelve
matiasa
matias
matiasa

pero cuando dejo en la funcion q , 0 en tiempo de espera en el setimeout me devuelve
matias
matiasa

function a(nombre) {
    return new Promise((resolve, rejected) => {
        setTimeout(() => {

            resolve(nombre);
            return console.log(`Hola ${nombre}`);
        }, 1000);
    })
    
}

function q() {
    return new Promise((resolve, rejected) => {
        setTimeout(() => {

            resolve(nombre);
            console.log(`Hola ${nombre}a`);
        }, 0);
    })
}


let nombre = "matias";
  q()
    .then(nombre => a(nombre).then(nombre=>q()))
    .catch(error => console.log(error));
function hola(nombre) {
  return new Promise( function(resolve,reject){
    setTimeout(function () {
      console.log('Hola, ' + nombre);
      resolve(nombre);
    }, 1500);
  });
  
}

function hablar(nombre) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      console.log('Bla bla bla bla...');
      resolve(nombre);
    }, 1000);
  });
}

function adios(nombre) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      console.log('Adios', nombre);
      resolve();
    }, 1000);
  });
}

function conversacion(nombre, veces, callback) {
  if (veces > 0) {
    hablar(function () {
      conversacion(nombre, --veces, callback);
    })
  } else {
    adios(nombre, callback);
  }
}

/**
 * Un ejemplo solo con hola y adios
 */
//console.log('Iniciando proceso...');
//hola('Santiago')
//  .then(adios) // no hace falta pasarle el parametro ya que es el mismo
//  .then(() =>{
//    console.log('Proceso Terminado');
//  }) 
//  .catch(e =>{
//    console.error(e);
//  });

/**
 * Un ejemplo solo con hola , hablar y adios
 */
console.log('Iniciando proceso...');
hola('Santiago')
  .then(hablar)
  .then(hablar)
  .then(hablar)
  .then(adios) // No hace falta pasarle el parametro ya que es el mismo
  .then(() =>{
    console.log('Proceso Terminado');
  }) 
  .catch(e =>{
    console.error('Error: ',e);
  });

Mas intresante las promesas. el manejo de errores es super…

function hola(nombre, micallback) { 
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (true) {
                console.log(`hola ${nombre}`);   
                resolve(nombre); 
            } else {
                reject('Error al saludar');
            }
            
        }, 1000);
    });
}

function hablar(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (true) {
                console.log('bla bla bla bla');
                resolve(nombre);
            } else {
                reject('Error encontrado al hablar');
            }
            
        }, 500);
    });
}


function adios(nombre, otrocallback) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (true) {
                console.log(`Adios ${nombre}`)
                resolve();
            } else {
                reject('error al despedirse');
            }
            
        }, 2000);
    });
}

function conversacion(nombre, veces, callback) {
   if (veces >0) {
       hablar(() => { 
           conversacion(nombre, --veces, callback);
       })
   } else {
       adios(nombre, callback);
   }
  
}

//-----------------

//callback hell

console.log('iniciando el proceso..');
hola('Francisco')
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(adios)
    .then((nombre) => { console.log('terminado el proceso') })
    .catch(error => { 
        console.error('ha habiado un error');
        console.error(error);
    })






Disculpen estoy probando usar los resolve() con objetos.Sin embargo, me he topado con un problema. El resolve() no ejecuta en cierta condición, alguien amablemente me podría decir el porque llego 2 horas buscando información pero nada.Gracias

<code>
function soyAsincronaHola(veces,nombre){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            //console.log('Estoy siendo asincrona')
            console.log('Hola, '+ nombre)
            resolve({veces:veces,nombre:nombre})
        },1500)
    })
}

function hablar(data){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log('Bla bla bla bla ...')
           resolve({veces:data.veces,nombre:data.nombre})  // Si por algun motivo falla 
            //reject('Hay un error')
        },1000)   
    })
}

function conversacion(data){  // data que viene {veces:veces,nombre:nombre}
    //console.log(data.veces)
    //console.log(data.nombre)
    return new Promise((resolve,reject)=>{
        if(data.veces > 0){
            hablar({veces: --data.veces,nombre:data.nombre}).then(conversacion)
        }else{
            console.log(data.veces)
            console.log('entra')
            resolve(data.nombre)  // No ejecuta cuando las veces son mayores a 0 , pero si son menores a 0 si ejecuta 
        }
    })   
}

function soyAsincronaAdios(nombre) {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log('Adios, '+ nombre)
            resolve(nombre)
        },1000)
    })
}

function terminar(nombre){
    console.log(`${nombre} esto termina aqui`)
}

console.log('Iniciando el proceso')
soyAsincronaHola(1,'Bryan')
    //.then(hablar)
    .then(conversacion)
    .then(soyAsincronaAdios) //al final de soyasincrona ya le estoy pasando el parametro que usarà
    .then(terminar) // al final de soyasincronaAdios ya le estoy pasando el parametro que usarà
    .catch(error =>{ // SIEMPRE que trabajamos con promesas usar CATCH 
        console.error('Ha habido un error: ')
        console.error(error)
    })
    

Promesas.js

function hola(nombre) {
    return new Promise(function (resolve, reject) {
        setTimeout(function() {
            console.log("Hola, " + nombre);
            resolve(nombre);
        }, 1500);
    });
}
function hablar(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            console.log("bla, bla, bla, bla");
            resolve(nombre);
        }, 1000);
    });
}
function adios(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            console.log("Adios", nombre);
            resolve();
        }, 1000);
    });
}

// --
console.log('Iniciando el proceso...');
hola('Cristobal')
    .then(hablar)
    .then(adios)
    .then((nombre) => {
        console.log('Terminado el proceso');
    });



https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Usar_promesas

Una Promise (promesa en castellano) es un objeto que representa la terminación o el fracaso de una operación asíncrona. Dado que la mayoría de las personas consumen promises ya creadas, esta guía explicará primero cómo consumirlas, y luego cómo crearlas.

Promesas


Para evitar por completo los callbacks hell, se creo una nueva forma de trabajar con asincronía, esta forma son las promesas, el concepto es que las Promise tienen estados.

Pueden ser:

  • Resueltas
  • No resueltas
  • Fallar
function hola(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Hola, ${nombre}`)
            resolve(nombre)
            reject('No sé qué paso')
        }, 1500)
    })
}

Y ejecutar la promesa

hola('Carlos')
    .then(hablar)
    .then(adios)
    .then(nombre => {
        console.log(`Terminado el proceso`)
    })
    // Utilizamos el catch para que cuando haya un error nos lo comunique
    .catch(error => {
        console.error('Ha habido un error')
        // El error que dispara es lo que hayamos colocado dentro de reject()
        console.error(error)
    })

😃

function hablar(nombre) {
  return new Promise((resolve, reject) => {
    let random = Math.random()
    setTimeout(function() {
      console.log('Bla bla bla bla bla...')
      if (random >= .25) resolve(nombre)
      else reject('Jerjes: JAJAJAJA!!!')
    }, 100)
  })
}

Definición:

Una promesa es un objeto que representa un valor que puede que esté disponible «ahora», en un «futuro» o que «nunca» lo esté. Lo que significa que solo puede ejecutar una acción al mismo tiempo, por lo que utilizar promesas facilita, en buena medida, el control de flujos de datos asíncronos en una aplicación.

// Declaracion de funciones 
//Funcion hola
function hola(nombre){
  return new Promise(function(resolve, reject){
    setTimeout(function() {
      console.log('Hola ' + nombre);
      //resolve(nombre);
      // En caso de que la funcion falle manda el reject 
      reject('Algo no salio como lo pensaba')
  }, 1000);
  });
}
//Funcion hablar 
function hablar(nombre){
  return new Promise((resolve, reject) => {
    setTimeout(function(){
      console.log('Bla.. Bla.. Bla..');
      resolve(nombre);
    },1000);
  });
}

//Funcion adios 
function adios(nombre){
  return new Promise( (resolve, reject) => {
    setTimeout(function() {
      console.log('Adios ' + nombre);
      resolve();
    }, 1000);
  });
}


//  ---- 
// Inicio de la funcion 
console.log('Iniciando el proceso');
hola('Robb')
  .then(hablar)
  .then(hablar)
  .then(adios)
  .then((nombre) => {
    console.log('Terminado el proceso');
  })
  // Manejo de errores: en caso de que el proceso interno de la funcion 
  // falle el catch se trae la informacion del reject 
  .catch(error =>{
    console.error('Log de Errores: ')
    console.error(error)
    })

este es el ejercicio

function hablar(){
  return new Promise ((resolve,reject)=>{
    setTimeout(function(){
    console.log("hablando blaa bla bla bla");
   resolve()
  },1000)
  });
  
}


function hola(nombre){
  return new Promise ((resolve,reject)=>{
  setTimeout(function(){
      console.log("hola "+nombre);
      resolve(nombre);
    },1000)
  });
}



function adios(nombre){
  return new Promise ((resolve,reject)=>{
  console.log("adios "+ nombre);
});
}


hola("david")
.then(hablar)
.then(hablar)
.then(hablar)
.then(hablar)
.then(adios)
.catch(Error=>{
  console.error("ups");
})

El .then también puede recibir el reject (2 callbacks). En el minuto 5:36 de este video, se puede ver con la ayuda de VS code, sin embargo en el examen tuve mal esta pregunta 😦

Dejo un ejemplo, aunque considero que es mala práctica pero solo para saber, sí se puede dos callbacks en un .then

function promesa() {
    return new Promise( (resolve,reject)=> {
        let random = Math.random();
        console.log(random); 
        if ( random < 0.5 ) {
            resolve('Todo bien!!');
         } else {
            reject('Errorrrrr!!');
         }    
    });
}

promesa()
    .then(data => console.log(data), err => console.log('error', err))

Siempre que usemos promesas debemos añadir un catch. Si no lo usamos, un error se podría propagar por todo el código. En cambio al implementarlo, el código se pausa apenas capture el error.

Esta explicaciones de asincronismo están muy bien hechas 😄

Conclusión de esta clase:
Resolve y rejects son callbacks que son llamados con .then() y .catch().

Al fin estoy entendiendo los callbacks y promesas, que emoción!

Muchas gracias Carlos, aunque en cursos pasados pensé que entendia este tema, me doy cuenta de que tenia muchos baches, ahora veo las cosas mas claras.

![](https://static.platzi.com/media/user_upload/promises.js-bf85fef8-a9ea-4da0-b7cc-4e3dd08340c4.jpg)
**PROMESAS** *Una **Promesa*** (Promise) *en* **JavaScript** *es un **objeto** que **representa** un **valor** que puede estar **disponible** **ahora**, en el **futuro** o **nunca**. Permite **asociar** **manejadores** con el **eventual** **éxito** o **fallo** de una **operación** **asíncrona**, **similar** a cómo los **métodos** **síncronos** **devuelven** **valores** de **inmediato**, pero en **lugar** de **devolver** el **valor** **final**, la **función** **asíncrona** **devuelve** una **promesa** de **proporcionar** el **valor** más **adelante**.* *Una **Promesa** puede estar en **uno** de **tres** **estados**:* * **pending (pendiente): estado inicial, ni cumplido ni rechazado.** * **fulfilled (cumplida): la operación se completó con éxito.** * **rejected (rechazada): la operación falló.**
el profe es el profesor del año con Leónidas el guerrero del año jajaja
Dejo el ejemplo con la función recursiva de conversación. ```js function sayHello (name) { return new Promise ((resolve, reject) => { setTimeout(() => { console.log("Hello,", name); resolve(name); }, 1500); }); } function speak () { return new Promise (resolve => { setTimeout(() => { console.log("Bla Bla Bla..."); resolve(); }, 1500); }); } function sayBye (name) { return new Promise (resolve => { setTimeout(() => { console.log("Bye,", name); resolve(); }, 1200); }); } function conversation (nameFinal, times) { if ( times > 0 ) { return speak().then(() => conversation(nameFinal, --times)) } else { return Promise.resolve(nameFinal); } } console.log("Start process"); sayHello("Raymundo") .then(name => conversation(name, 2)) .then(nameFinal => sayBye(nameFinal)) .then(() => console.log("End process")) ```

Promesas

Promise

Las promesas son una forma de gestionar la programación asincrónica en JavaScript de una manera más ordenada y legible. Permiten realizar operaciones asincrónicas y proporcionan una forma más estructurada de manejar los resultados exitosos o los errores que puedan surgir. Aquí tienes ejemplos de cómo trabajar con promesas en JavaScript:

Ejemplo de Promesa Básica:

const miPromesa = new Promise((resolve, reject) => {
  // Simulamos una operación asincrónica (por ejemplo, una solicitud de red).
  setTimeout(() => {
    const exito = true; // Cambia a false para simular un error
    if (exito) {
      resolve("Operación exitosa");
    } else {
      reject("Ocurrió un error");
    }
  }, 2000); // Simulamos un retardo de 2 segundos
});

miPromesa
  .then((resultado) => {
    console.log("Éxito:", resultado);
  })
  .catch((error) => {
    console.error("Error:", error);
  });

En este ejemplo, creamos una promesa que simula una operación asincrónica (por ejemplo, una solicitud de red) y resuelve o rechaza la promesa en función de si la operación tuvo éxito o no. Luego, utilizamos .then() para manejar el caso de éxito y .catch() para manejar el caso de error.

Ejemplo de Promesa Encadenada:

function operacionAsincronica() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Primera operación completada");
    }, 1000);
  });
}

operacionAsincronica()
  .then((resultado) => {
    console.log(resultado);
    return "Segunda operación completada";
  })
  .then((resultado) => {
    console.log(resultado);
  })
  .catch((error) => {
    console.error("Error:", error);
  });

En este ejemplo, tenemos una función que devuelve una promesa. Luego encadenamos múltiples .then() para manejar varias operaciones asincrónicas en secuencia.

Ejemplo de Múltiples Promesas:

const promesa1 = fetch("<https://jsonplaceholder.typicode.com/posts/1>");
const promesa2 = fetch("<https://jsonplaceholder.typicode.com/posts/2>");

Promise.all([promesa1, promesa2])
  .then((respuestas) => {
    return Promise.all(respuestas.map((respuesta) => respuesta.json()));
  })
  .then((datos) => {
    console.log("Datos de ambas solicitudes:", datos);
  })
  .catch((error) => {
    console.error("Error:", error);
  });

En este ejemplo, usamos Promise.all() para manejar múltiples promesas simultáneamente. Esperamos a que ambas promesas se resuelvan y luego procesamos los datos.

Las promesas proporcionan un enfoque más estructurado y legible para trabajar con operaciones asincrónicas en JavaScript, y son especialmente útiles cuando se realizan solicitudes de red, accesos a bases de datos o lectura/escritura de archivos.

Había hasta llorado por este tema de los callbacks y promesas, pero este curso me tiene llena de esperanzas! creo que el profe explica muy bien! Al fin entiendo XD

despues de mucho timpo resolvi mi promesa de entender codigo asyncrono

const hello = (name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Hello ${name}`)
            resolve(name)
        }, 1000)
    })
}

const speak = (name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Bla bla bla`)
            resolve(name)
        }, 1000)
    })
}

const err = (name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`This is a controlled error by: ${name}`)
            reject(name)
        }, 1000)
    })
}

const goodbye = (name) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Goodbye ${name}`)
            resolve(name)
        }, 1000)
    })
}

// Execution
console.log('Start App')
hello('jsdnlb')
    .then(speak)
    .then(err)
    .then(speak)
    .then(goodbye)
    .then((name) => {
        console.log('App completed')
    })
    .catch(error => {
        console.error('Controlled error executed')
    })

Por fin comprendí las promesas. ¡Gracias profe Carlos!

Manejo de Errores

Promesas

Promesas

Las promesas (promise) son una sintaxis más elegante y legible de realizar callbacks, creando así un código mucho más escalable y entendible para tod@s l@s coleg@s. Una promesa, al final no deja de ser un callback, solo que, con la novedad de tener estados. Una promesa puede tener tres posibles estados:

⏳ Pending: Estado inicial, antes de que la promesa haya sido resulta o rechazada.
❌ Rejected: Ha habido un error en la promesa y se ha rechazado.
✅ f Ulfilled: La promesa se ha completado con éxito.

Para utilizar una promesa, sólo debemos instanciarla de su clase haciendo uso de la palabra reservada new. Las mismas reciben dos parámetros; resolve y reject, que a su vez, representan dos de sus estados.

Utilizamos el parámetro resolve para retornar el valor deseado y el parámetro reject, para retornar el valor no deseado, o sea, el fallo.

New Promise( (resolve, reject) =>
{
…code
If(code === true)
{
resolve(correctValue);
}
else
{
Reject(wrongValue);
}
});

Para poder obtener los valores que retorna una promesa/función, debemos utilizar el método .then. Este método recibe un callback, el cual tendrá como parámetro, el valor retornado en el resolve o reject.

Siempre que usemos una promesa, además de usar el método .then, debemos usar el método .catch, el cual captura vía parámetro, el error ocurrido en caso que exista alguno. Evitando así, que dicho error rompa el programa y se propague por la red.

myPromise(‘Parametro’)
.then( data => console.log(data) )
.catch( err => console.log(err) );

Este profesor no explica mal pero va muy rapido, encontre este video que puede ayudarte a entender la asincronia de JS y de NodeJS
https://www.youtube.com/watch?v=Q3HtXuDEy5s

me perdí con los callbacks 😦

La mejor manera de evitar errores con callbacks en js es usando typescript XD

le creo mas a estas promesas que a las de mi ex

💽 Codigo

function hola(nombre) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      console.log("Hola, " + nombre);
      resolve(nombre);
    }, 1000);
  });
}

function hablar(nombre) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      console.log("Bla bla bla bla...");
      reject("Hay un error");
      //resolve(nombre);
    }, 1000);
  });
}

function adios(nombre) {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      console.log("Adios ", nombre);
      resolve();
    }, 1000);
  });
}

function conversacion(nombre, veces, callback) {
  if (veces > 0) {
    hablar(function () {
      conversacion(nombre, --veces, callback);
    });
  } else {
    adios(nombre, callback);
  }
}

// ---
console.log("Iniciando el proceso...");
hola("Carlos")
  .then(hablar)
  .then(adios)
  .then((nombre) => {
    console.log("Terminado el proceso");
  })
  .catch((error) => {
    console.log("Ha habido un error:");
    console.error(error);
  });

Algo que tenemos que tomar en cuenta es:

Si le aumentamos el tiempo de setTimeout a la función de hablar a 3000:

Esto hará que cada llamada a esa función en el encadenamiento, se tarde el mismo tiempo por cada una y si la ponemos 3 veces obtendremos un total de 9 segundos en total.

la funcion maneja el mismo catch si se pasa por default el mismo parametro, si no se rompe ejemplos speak & speakone

<code> 
function hi(name){
    return new Promise((resolve, reject) =>{
        setTimeout(function() {
            console.log("Hi " + name);
            resolve(name);
        }, 5000);
    });
}


function speakone(name){
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log(name + ' : one Bla bla bla')
            // resolve()
            reject();
        }, 1000)
    })
    .catch(error => {
        console.error("Error in speakone")
        return("sds")
    })
}

function speak(name){
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            console.log(name + ' : Bla bla bla')
            // resolve()
            reject();
        }, 1000)
    })
}


function bye(name){
    return new Promise((resolve, reject) =>{
        setTimeout(function() {
            console.log("bye " + name);
            resolve()
        }, 1000);
    })
}


console.log("initial process");
hi('rafaelromariorv')
    .then(speakone('hasjhsaj'))
    /*la funcion maneja el mismo catch si se pasa por default
    el mismo parametro, si no se rompe 
    ejemplos speak & speakone
    */
    .then(speak)
    .then(bye('rafaelromariorv_name'))
    .then((name) => {
        console.log("end process")
        // speak('rafaelromariorv')
    })
    .catch(error => {
        console.error("Error")
    })

Esta explicacion de promesas si me gusta

Las promesas nos sirve para ejecutar codigo asincrono que se haya resuelto(resolve), o que haya devuelto un error(reject). La forma de utilizarlo es la siguiente:

function saludar(nombre){
/* 
Retornamos una nueva instancia del objecto Promise, declarando sus 2 parametros (resolve, reject). Acontinuacion declaramos un resolve y un reject.
*/
  return new Promise((resolve, reject) => {
    resolve(nombre);
    reject();
  })
}


saludar('Fabio')
//utilizamos .then cuando la promesa haya sido resultad
  .then(nombre => console.log(`Hola ${nombre}`))
//utilizamos .catch cuando la promesa haya resultado en un error
  .catch(error => console.log(`Hubo un error: ${error} `));

Las promesas son una propuesta ante los callbacks, pero cambian un poco este concepto. Las promesas pueden tener un estado, pueden estar:

  • Pending (O pendientes).
  • Fullfilled (O cumplidas).
  • Rejected (O Rechazadas).

Ante esto es muy necesario controlar estos estados, sobretodo cuando la promesa no se resuelve y debemos devolverle algo al script para estar notificados de esto y que a su vez, el flujo de la aplicacion no se vea interrumpido

Excelente profesor, tiene una forma muy bien direccionada de explicar.

function hola(nombre) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { 
            console.log('Hola ' + nombre); 
            resolve(nombre);
        }, 1000);
    });
}

function hablar(nombre){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('adding characters to callback...')
            reject('Ocurrio un problema');
        }, 1500);
    });
}


function adios(nombre, otroCallback) {
    return new Promise ((resolve, reject)=>{
        setTimeout( function () {
            console.log('Adios estimado ' + nombre);
            resolve(nombre);
        }, 1000);
    })
}

//---

console.log('Iniciando el proceso...');
hola("John")
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(adios)
    .then((nombre)=>{
        console.log('Terminado el proceso...');
    })
    .catch(error => {
        console.error('¡Cuidado, ocurrio un error!')
        console.error(error);
    })

Al fin estoy entnediendo bien el asincronismo y las promesas 👾👾

No soy fanatico de las promesas, voy más por async/await me parece más limpio.

Aunque se que este curso tiene un tiempo.

Muy bueno este curso, el profesor excelente! Muy llevadera la clase

La principal diferencia entre callback y promise es que estas últimas se pueden ir anidando

Para evitar el uso de callbacks se hace el uso de promesas, las cuales cambian el concepto de su estado.
Las promesas son una clase global y se pueden llamar o poner similar a una función. Las funciones en lugar de ejecutar cosas cuando se deba, van a devolver la promesa y quien la llame pueda estar pendiente de su estado.

  • Resolve y reject van a permitir que se resuelvan las promesas si todo va bien o frenarlo si hay errores.
  • En caso de errores se le pasa un catch error, donde en lugar de seguir ejecutando las demás funciones, para no seguir propagando el error, se va al catch, atrapando el error mas rápido y evitando que se propague.
  • Siempre que se haga una promesa, se debe poner un catch
function hola(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Hola ${nombre}`);
            resolve(nombre);
        }, 1000);
    });
}

function hablar(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`${nombre}: BlaBlaBla`);
            resolve(nombre);
        }, 1000);
    });
}

function adios(nombre) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(`Adiós, ${nombre}`);
            resolve();
        }, 1000);
    });
}

function conversacion(nombre, veces) {
    promesa = hola(nombre);
    while (veces-- > 0){
        promesa = promesa.then(hablar);
    }
    promesa
        .then(adios)
        .catch(error => { console.log("Hubo un error") });
}

console.log("Iniciando proceso");
// hola("Sebastián")
//     .then(hablar)
//     .then(adios)
//     .catch(error => {
//         console.log("Hubo un error");
//     });

conversacion("Sebastián", 5);


Muy bien explicado

function hola(nombre){
    return new Promise((resolve, reject) => {
        setTimeout(()=>{
            console.log(`Hola ${nombre}`);
            resolve(nombre);
        }, 1000);
    });
    
}

function adios(nombre){
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log(`Adios ${nombre}`);
            resolve();
        }, 1000);
    });
}


function hablar(nombre){
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log('Bla bla bla');
            resolve();
            reject('Hay un error'); 
        }, 1000);
    })
}


// --- 
console.log('Iniciando el proceso...');

hola('Erik')
    .then(hablar)
    .then(hablar)
    .then(hablar)
    .then(adios)    
    .then((nombre)=>{
        console.log('Terminado el proceso');
    })
    .catch(error => {
        console.error('Ha habido un error');
        console.error(error);
    })