javascript angularjs promise chaining

javascript - Promesas de cadena con AngularJS



ng-bind-html angularjs (2)

Si necesita encadenar promesas secuencialmente en Angular, simplemente puede devolver las promesas de una a otra:

callFirst() .then(function(firstResult){ return callSecond(); }) .then(function(secondResult){ return callThird(); }) .then(function(thirdResult){ //Finally do something with promise, or even return this });

Y si desea devolver todo esto como una API:

function myMethod(){ //Return the promise of the entire chain return first() .then(function(){ return second(); }).promise; }

Tengo un servicio llamado paymentStrategy que se inyecta en mi controlador.

$scope.buy = function() { paymentStrategy.buy() .then(function(response) { } }

Este método de compra de paymentStrategy desencadena varios métodos que deben llamarse secuencialmente. Cuando todos los métodos dentro de buy () están listos, entonces () debe llamarse.

Es probablemente trivial, pero soy bastante nuevo en angular.

Por el momento, buy (). Then () se activa inmediatamente después de los métodos init (). Tengo la sensación de que debemos poner todos estos métodos en una serie de promesas y aplicar $ q.all ().

Cualquier ayuda o sugerencia sería muy apreciada

angular.module(''deps-app.payment.services'', []). factory(''paymentStrategy'', function($q) { var deferred = $q.defer(); var ITEM_TO_PURCHASE = "test.beer.managed"; var promises = []; var handlerSuccess = function(result) { deferred.resolve(result); }; var handlerError = function(result) { deferred.reject(result); }; _init = function() { inappbilling.init(handlerSuccess, handlerError, { showLog:true }); return deferred.promise; } _purchase = function() { inappbilling.buy(handlerSuccess, handlerError, ITEM_TO_PURCHASE); return deferred.promise; } _consume = function() { inappbilling.consumePurchase(handlerSuccess, handlerError, ITEM_TO_PURCHASE); return deferred.promise; } return { buy: function() { _init(); .then(_purchase()); .then(_consume()); return deferred.promise; } } });


Haz todos los métodos atomar, agregando sus propias promesas. En su código, la primera resolve completará toda la solicitud.

Si los métodos tienen su propia promesa, puede encadenarlos con facilidad.

angular.module(''deps-app.payment.services'', []).factory(''paymentStrategy'', function($q) { var ITEM_TO_PURCHASE = "test.beer.managed"; _init = function() { return $q(function (resolve, reject) { inappbilling.init(resolve, reject, { showLog: true }); }); }; _purchase = function() { return $q(function (resolve, reject) { inappbilling.buy(resolve, reject, ITEM_TO_PURCHASE); }); }; _consume = function() { return $q(function (resolve, reject) { inappbilling.consumePurchase(resolve, reject, ITEM_TO_PURCHASE); }); }; return { // In this case, you don''t need to define a additional promise, // because placing a return in front of the _init, will already return // the promise of _consume. buy: function() { return _init() .then(_purchase) // remove () from inside the callback, to pass the actual method // instead the result of the invoked method. .then(_consume); } };

});