Una promesa es una "cosa" que representa los resultados "eventuales" de una operación, por así decirlo. El punto a tener en cuenta aquí es que, abstrae los detalles de cuándo sucede algo y le permite centrarse en lo que debería suceder después de que algo suceda. Esto dará como resultado un código limpio y fácil de mantener donde, en lugar de tener una devolución de llamada dentro de una devolución de llamada dentro de una devolución de llamada, su código se verá algo así:
var request = new Promise(function(resolve, reject) {
//do an ajax call here. or a database request or whatever.
//depending on its results, either call resolve(value) or reject(error)
//where value is the thing which the operation's successful execution returns and
//error is the thing which the operation's failure returns.
});
request.then(function successHandler(result) {
//do something with the result
}, function failureHandler(error) {
//handle
});
La especificación de las promesas establece que una promesa
then
El método debe devolver una nueva promesa que se cumpla cuando finalice la devolución de llamada de SuccessHandler o la falla. Esto significa que puede encadenar promesas cuando tiene un conjunto de tareas asíncronas que deben realizarse y asegurarse de que la secuencia de operaciones está garantizada como si hubiera utilizado devoluciones de llamada. Entonces, en lugar de pasar una devolución de llamada dentro de una devolución de llamada dentro de una devolución de llamada, el código con promesas encadenadas se ve así:
var doStuff = firstAsyncFunction(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
};
doStuff
.then(secondAsyncFunction) //returns a promise
.then(thirdAsyncFunction); //returns a promise
Para saber más sobre las promesas y por qué son súper geniales, visite el blog de Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/