Обещание - это «вещь», которая представляет, так сказать, «возможные» результаты операции. Здесь следует отметить, что он абстрагирует детали того, когда что-то происходит, и позволяет вам сосредоточиться на том, что должно произойти после того, как что-то произойдет. Это приведет к чистому, поддерживаемому коду, где вместо обратного вызова внутри обратного вызова внутри обратного вызова ваш код будет выглядеть примерно так:
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
});
Спецификация обещаний гласит, что обещание
then
Метод должен возвращать новое обещание, которое выполняется, когда заданный обратный вызов successHandler или failHandler завершен. Это означает, что вы можете связывать воедино обещания, когда у вас есть набор асинхронных задач, которые необходимо выполнить, и вы можете быть уверены, что последовательность операций гарантирована, как если бы вы использовали обратные вызовы. Таким образом, вместо передачи обратного вызова внутри обратного вызова внутри обратного вызова, код с связанными обещаниями выглядит так:
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
Чтобы узнать больше об обещаниях и о том, почему они очень крутые, загляните в блог Доменика: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/