2015-09-25 27 views
2

我想写一个服务,它做多个异步请求,我使用$ q返回一个承诺,问题是我正在写一些重复的代码,我想删除重复。我如何写在AngularJS的承诺

app.factory('MyService',function($q){ 
    var ser = { 
      getA:function(){     
       var d= $q.defer; //repetitive code 
       asyn1().then(function(){ 
        aync2().then(function(res){ 
         //Process data 
         doSomething(res) 
         d.resolve(); 
        }) 
       }); 
       return d.promise 
      } , 
      getB:function(){ 
       var d= $q.defer; 
       asyn3().then(function(){ 
        aync4().then(function(res){ 
         //Process data 
         doSomething(res) 
         d.resolve(); 
        }) 
       }); 
       return d.promise 
      }        
    } 

    return ser; 
}); 

在每一个功能,我重复$q的事情,我怎么能避免重复。

回答

3

使用承诺链接:

getA: function() {     
    return asyn1().then(function(responseFromAsyn1) { 
     return aync2(responseFromAsyn1); 
    }).then(function(responseFromAsync2) { 
     return postProcess(responseFromAsync2); 
    }); 
} 

getA()现在比你原来的代码短得多,也更正确的:主叫方会真正得到一个拒绝承诺如果asyn1()async2()失败。

+0

我想要做一些数据预处理,aync2后,返回之前。所以我认为我不能忽视$ q –

+0

是的,你可以通过链接承诺。我会修改我的答案。 –

0

承诺的想法是编写的代码不会增加右边的缩进,并且还会处理一个叫做“回拨地狱”的东西。

此代码

  getA:function(){     
      var d= $q.defer; //repetitive code 
      asyn1().then(function(){ 
       aync2().then(function(){ 
        d.resolve(); 
       }) 
      }); 
      return d.promise 
     } 

可以写成这样

  getA:function(){ 
      return async1() 
       .then(async2) 
       .then(processTheResultOfAsync2); 
      } 

,或者如果你需要结果的一些同步处理从async1

  getA:function(){ 
      return async1() 
       .then(function(result) { 
       ..... soome synchronous processing 
       return async2(processed); 
       }); 
      } 

,或者如果你需要异步processinc

 getA:function(){ 
      return async1() 
       .then(function(result) { 
       return processAsync(result) 
        .then(async2); 
       }); 
      } 

承诺应该让你的生活更简单,如果没有发生这种情况,你就没有正确使用它们!

https://github.com/kriskowal/q

+0

我想在返回之前对aync2之后的数据进行一些预处理。所以我想我不能忽略$ q –

+0

返回async1()。然后(async2).then(procesAsync2Result); – vbuhlev

0

演示我的jsfiddle页: https://jsfiddle.net/MikaViko/kprbneha/

``var module = angular.module('app', []); 
    module.controller('appController', ['$scope', '$q', function($scope, $q) { 

     var fibonacci = [1, 1, 2, 3, 5, 8, 13, 20]; 

     $scope.getItem = function(index) { 
     var promise = getItemPromise(index); 
     promise.then(
      function(item) { 
      $scope.item = item; 
      $scope.error = ""; 
      }, 
      function(error) { 
      $scope.error = error; 
      $scope.item = null; 
      } 
     ); 
     }; 

     function getItemPromise(index) { 
     var item = fibonacci[index]; 
     var deferred = $q.defer(); 

     if (item) 
      deferred.resolve(item); 
     else 
      deferred.reject("L'item n'existe pas ou l'index n'est pas valide."); 

     return deferred.promise; 
     } 

    }]); 
+1

请提供您的代码的解释。查看[回答]了解如何提供良好答案的详细信息。 –