Tag Archives: promise
Как не надо использовать promise
http://taoofcode.net/promise-anti-patterns/
Promise и AngularJS
http://youtu.be/XcRdO5QVlqE Слайды — http://christianlilley.wordpress.com/2014/01/17/slides-im-postal-for-promises-in-angular-delivered-at-ng-conf-2014/. Более развёрнутые слайды с другой его конференции — http://christianlilley.wordpress.com/2013/09/19/promises-promises-mastering-async-io-in-javascript-with-the-promise-pattern/.
Скоро в javascript появятся нативные promises
http://www.html5rocks.com/en/tutorials/es6/promises/ Совместимы с библиотекой Q (https://github.com/kriskowal/q) и другими, но не совсем то же, что и jquery.promise, т.к. тот не совсем совместим со спецификацией Promises/A+ https://github.com/promises-aplus/promises-spec
Q — promises в node.js и в браузере
https://github.com/kriskowal/q Хорошая библиотека, работает и на сервере, и на клиенте. Маленькая. В отличие от jQuery.Promise, при возникновении исключения срабатывает rejected, т.е. не надо задумываться о возникновении исключительных ситуаций.
jQuery.deferred
В jQuery 1.5 была полностью переработана модель асинхронных запросов. Теперь они возвращают deferred-объект, содержащий promise-объект, который содержит методы, позволяющие узнать состояние запроса или навесить дополнительные обработчики. promise-Объект содержит методы then, done, fail, isResolved и isRejected. Суть нового подхода состоит в следующем:
1 2 3 4 5 6 7 |
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2){ // a1 и a2 - аргументы, отвечающие соответственно за запросы к страницам page1 и page2 var jqXHR = a1[2]; /* массив состоит из [ "success", statusText, jqXHR ] */ if ( /Оппа!/.test(jqXHR.responseText) ) { alert("Где-то на первой странице есть 'Оппа!'."); } }); |
$.when принимает deferred-объект или объекты и возвращает promise-объект. Можно делать и так:
1 2 3 4 5 6 7 8 9 10 11 12 |
var $promise; if ( tt == 1 ) { $promise = $.when( $.getJSON( ... ) ); } else if ( tt == 2 ) { $promise = $.when( $.getJSON( ... ), $.getJSON( ... ), $.post( ... ) ); } else { $promise = $.when( console.log( 'else' ) ); } $promise. then( function() { console.log( 'done', data ) } ); |
…