链与承诺AngularJS [英] Chain promises with AngularJS

查看:124
本文介绍了链与承诺AngularJS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个叫paymentStrategy服务,得到我的控制器注入。

  $ scope.buy =功能(){
  paymentStrategy.buy()
    。然后(功能(响应){  }
}

从paymentStrategy这买方法触发几种方法需要被依次称为。当团购中的所有方法()完成,则()需要被调用。

这可能是微不足道的,但我很新的角度。

目前,买()。那么()被触发的初始化后,直()方法。
我有一种感觉,我们需要把所有的论文方法承诺的数组中,并应用​​$ q.all()。

任何帮助或建议将是极大的pciated AP $ P $

  angular.module('deps-app.payment.services',[])。
  工厂('paymentStrategy',函数($ Q){ 变种推迟= $ q.defer();
 VAR ITEM_TO_PURCHASE =test.beer.managed;
 VAR承诺= []; VAR handlerSuccess =功能(结果){
      deferred.resolve(结果);
  }; VAR handlerError =功能(结果){
      deferred.reject(结果);
  }; _init =功能(){     inappbilling.init(handlerSuccess,handlerError,{showLog:真});
     返回deferred.promise;
    }  _purchase =功能(){
        inappbilling.buy(handlerSuccess,handlerError,ITEM_TO_PURCHASE);
        返回deferred.promise;
  }  _consume =功能(){
        inappbilling.consumePurchase(handlerSuccess,handlerError,ITEM_TO_PURCHASE);
        返回deferred.promise;
  }返回{     买:功能(){      _在里面();
        。然后(_purchase());
        。然后(_consume());      返回deferred.promise;
    } }
});


解决方案

请所有方法atomar,加入了自己的诺言。在您的code,第一个决心将完成整个请求。

如果这些方法都有自己的诺言,你可以轻松地把它们连。

  angular.module('deps-app.payment.services',[])。
  工厂('paymentStrategy',函数($ Q){ VAR ITEM_TO_PURCHASE =test.beer.managed;
 VAR承诺= []; _init =功能(){
     变种推迟= $ q.defer();
     inappbilling.init(deferred.resolve,deferred.reject,{showLog:真});
     返回deferred.promise;
    }  _purchase =功能(){
        变种推迟= $ q.defer();
        inappbilling.buy(deferred.resolve,deferred.reject,ITEM_TO_PURCHASE);
        返回deferred.promise;
  }  _consume =功能(){
        变种推迟= $ q.defer();
        inappbilling.consumePurchase(deferred.resolve,deferred.reject,
                                                         ITEM_TO_PURCHASE);
        返回deferred.promise;
  }返回{
     //在这种情况下,你并不需要定义一个额外的承诺,
     //因为放置在_init前面的回报,就已经返回
     // _consome的承诺。
     买:功能(){
       返回_init()
        。然后(_purchase)
        //从回调内部取出(),通过实际的方法
        //代替被调用的方法的结果。
        。然后(_consume);
     }
 }
});

I have a service called paymentStrategy that get injected in my controller.

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

  }
}

This buy method from paymentStrategy triggers several methods that needs to be called sequentially. When all the methods within buy() are done, then() needs to be called.

It is probably trivial but I am quite new to angular.

At the moment, buy().then() gets triggered straight after the init() methods. I have the feeling we need to put all theses methods in a array of promises and apply $q.all().

Any help or suggestion would be greatly appreciated

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;                    
    }

 }
});

解决方案

Make all methods atomar, by adding their own promises. In your code, the first resolve will complete the whole request.

If the methods have their own promise, you can chain them with ease.

angular.module('deps-app.payment.services', []).
  factory('paymentStrategy', function($q) {

 var ITEM_TO_PURCHASE = "test.beer.managed";
 var promises = [];

 _init = function() {
     var deferred = $q.defer();
     inappbilling.init(deferred.resolve, deferred.reject, { showLog:true }); 
     return deferred.promise;
    }

  _purchase = function() {
        var deferred = $q.defer();
        inappbilling.buy(deferred.resolve, deferred.reject, ITEM_TO_PURCHASE);
        return deferred.promise;
  }

  _consume = function() {
        var deferred = $q.defer();
        inappbilling.consumePurchase(deferred.resolve, deferred.reject, 
                                                         ITEM_TO_PURCHASE);
        return deferred.promise;
  }

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 _consome.
     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);      
     }    
 }
});

这篇关于链与承诺AngularJS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆