Что по-настоящему заставило меня задуматься, так это эта презентация от Доменика Дениколы.
В github gist он дал описание, которое мне нравится больше всего, оно очень лаконично:
Смысл обещаний состоит в том, чтобы вернуть нам функциональную композицию и всплывающую ошибку в асинхронном мире.
Другими словами, обещания - это способ, который позволяет нам писать асинхронный код, который почти так же легко написать, как если бы он был синхронный .
Рассмотрим этот пример с обещаниями:
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
Это работает так, как если бы вы писали этот синхронный код:
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
(Если это все еще кажется сложным, посмотрите эту презентацию!)
Относительно Отложенных, это способ .resolve()
или .reject()
обещаний. В спецификации Promises / B она называется .defer()
. В jQuery это $.Deferred()
.
Обратите внимание, что, насколько мне известно, реализация Promise в jQuery не работает (см. Суть), по крайней мере, начиная с jQuery 1.8.2.
Предположительно он реализует Promises / A thenables , но вы не получите правильную обработку ошибок, которую вы должны, в том смысле, что вся функциональность «асинхронная попытка / отлов» не будет работать.
Что жаль, потому что иметь «try / catch» с асинхронным кодом очень круто.
Если вы собираетесь использовать Обещания (вы должны попробовать их со своим собственным кодом!), Используйте Kris Kowal's Q . Версия jQuery - это просто некий агрегатор обратного вызова для написания более чистого кода jQuery, но он упускает суть.
Что касается будущего, я понятия не имею, я не видел этого ни в одном API.
Редактировать: Выступление Доменика Дениколы на YouTube об обещаниях из комментария @ Farm ниже.
Цитата из Майкла Джексона (да, Майкла Джексона ) из видео:
Я хочу, чтобы вы запомнили эту фразу:
Обещанием является асинхронное значение .
Это превосходное описание: обещание похоже на переменную из будущего - первоклассную ссылку на то, что в какой-то момент будет (или произойдет).