Hace mucho tiempo , allá por el 2012, estuve revisando de qué trataba el patrón promise frente al patrón callback. En aquel entonces era necesario utilizar una librería adicional para poder utilizar dicho patrón, como JQuery y su objecto $.Deferred. Sin embargo, ya que ECMAScript 6 está prácticamente implementado en los navegadores más importantes, ya no es necesario utilizar librerías externas para utilizar este patrón.
Siguiendo el mismo ejemplo que utilicé en aquel artículo, este sería el mismo utilizando ES6, que queda incluso más limpio que con JQuery:
function calculateFibonacci(number) {
if (number == 0 || number == 1)
return number;
return (calculateFibonacci(number - 1) + calculateFibonacci(number - 2));
}
function doStuff(serie) {
return new Promise((resolve, reject) => {
if (typeof serie === 'number') {
var results = [];
for (var i = 0; i > serie - 1; i++) {
var result = calculateFibonacci(i);
console.log(result);
results.push(result);
}
console.log("for finished");
resolve(results.join(", "));
} else {
reject(new Error('Argument serie must be a number'));
}
})
}
doStuff(10)
.then(result => console.log(`Result: ${result}`))
.catch(error => console.log(`Something bad happened: ${error}`));
Si ejecutamos el resultado, verás que todo sigue funcionando correctamente:
He modificado un poco la función para que puedas ver que si paso a la función un valor que no es un número esta pasará por reject, en lugar de resolve, y podrás capturar cuándo una promesa es fallida a través del método catch.
¡Saludos!