2014-11-03 56 views
0

以下是推荐的方式使用$ HTTP来获取数据从一个工厂的控制 - 根据https://github.com/johnpapa/angularjs-styleguide

什么,我不明白的是如何在$ HTTP工作两个成功的回调(我评论什么,我想两个回调是)。 1)第一个回调的要点是什么? 2)vm.avengers指向哪里?它是对另一个对象的引用吗? 3)第二个callback中的'data'='response.data.results'从第一个? 4)我在计算3个回调链,这是正确的吗?

P.S.我已经知道了承诺,但要学习这种模式专门

工厂

/* recommended */ 

// dataservice factory 
angular 
.module('app.core') 
.factory('dataservice', dataservice); 

dataservice.$inject = ['$http', 'logger']; 

function dataservice($http, logger) { 
return { 
    getAvengers: getAvengers 
}; 

function getAvengers() { 
    return $http.get('/api/maa') 
     .then(getAvengersComplete) 
     .catch(getAvengersFailed); 

    //Callback One 
    function getAvengersComplete(response) { 
     return response.data.results; 
    } 

    function getAvengersFailed(error) { 
     logger.error('XHR Failed for getAvengers.' + error.data); 
    } 
} 

}

的控制器

function Avengers(dataservice, logger) { 
    var vm = this; 
    vm.avengers = []; 

    activate(); 

    function activate() { 
    return getAvengers().then(function() { //Callback 3 
     logger.info('Activated Avengers View'); 
    }); 
} 

function getAvengers() { 
    return dataservice.getAvengers() 
     .then(function(data) { //Callback 2 
      vm.avengers = data; 
      return vm.avengers; 
     }); 
}} 

回答

1
  1. 这个第一回调点是在数据进入应用程序之前对数据进行任何操作,并实际将有用数据从http r中提取出来esponse对象。
  2. vm.avengers声明在您的控制器的顶部。它使用“controller as”语法,并将其放在对控制器“this”对象的引用上。您最终使用vm.avengers访问视图中的数据。
  3. 正确。
  4. HTTP调用 - > getAvengersComplete - > getAvengers,所以正确的3个回调。
+0

不知道为什么这是downvoted,似乎是一个很好的答案给我 – Greg 2014-11-03 04:02:00