Uma promessa é uma "coisa" que representa os resultados "eventuais" de uma operação, por assim dizer. O ponto a ser observado aqui é que ele abstrai os detalhes de quando algo acontece e permite que você se concentre no que deve acontecer depois que algo acontecer. Isso resultará em um código limpo e sustentável, onde, em vez de ter um retorno de chamada dentro de um retorno de chamada, seu código será parecido com:
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
});
As especificações das promessas afirmam que uma promessa é
then
O método deve retornar uma nova promessa que é cumprida quando o retorno de chamada successHandler ou failHandler especificado é concluído. Isso significa que você pode encadear promessas quando tiver um conjunto de tarefas assíncronas que precisam ser executadas e ter certeza de que o seqüenciamento de operações é garantido como se você tivesse usado retornos de chamada. Portanto, em vez de passar um retorno de chamada para dentro de um retorno de chamada, o código com promessas encadeadas se parece com:
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 mais sobre as promessas e por que elas são super legais, confira o blog de Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/