Tag Archives: deferred
Как не надо использовать 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
AngularJS: одновременное асинхронное выполнение двух сервисов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
angular.module('MyModule', []). // controllers controller('FolderListCtrl', ['$scope', '$q', 'Async', 'Service1', 'Service2', function FolderListCtrl($scope, $q, Async, Service1, Service2) { $q. all([Async(Service1.query), Async(Service2.get)]). then(function (responses) { $scope.service1Res = responses[0]; $scope.service2Res = responses[1]; }); }]). factory('Async', ['$q', function Async($q) { return function (ResCall, params) { var d = $q.defer(); if (angular.isFunction(ResCall)) { ResCall(params, function(response) { d.resolve(response); }); return d.promise; } throw new Error('wrong invocation with ' + ResCall.toString()); }; }]) |
Можно было бы сделать дополнительные проверки, но мне они показались излишними. По мотивам этого ответа: http://stackoverflow.com/a/15300364/801426
Хорошее выступление про $.Deferred (Alex McPherson)
Если вдруг кто-то ещё не пользуется $.Deferred — обязательно посмотрите, вам понравится. Если уже пользуетесь, то можно посмотреть на оригинальные примеры использования, типа более удобной обёртки над setTimeout(). https://youtu.be/juRtEEsHI9E По просьбам: Вот ссылка на выступление — http://confreaks.com/videos/993-jqcon2012-i-promise-to-show-you-when-to-use-deferreds. Вот ссылка на слайды — https://github.com/alexmcpherson/jquery-talk/blob/master/jquery2012Defs.key (если сможете прочитать — молодцы;) ).
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 ) } ); |
…