$ http和工厂 - 这种模式如何工作?

时间:2014-11-03 03:07:07

标签: javascript angularjs

以下是使用$ http从工厂将数据导入控制器的推荐方法 - 根据https://github.com/johnpapa/angularjs-styleguide

我得到的是$ http的两个成功回调是如何工作的(我评论了我认为两个回调是什么)。 1)第一次回调有什么意义? 2)vm.avengers在哪里指向?它是对另一个对象的引用吗? 3)是数据'在第二个回调=' 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 个答案:

答案 0 :(得分:1)

  1. 第一个回调的要点是在数据进入应用程序之前对数据进行任何操作,并实际从http响应对象中提取有用数据。
  2. vm.avengers在控制器的顶部声明。它使用"控制器作为"语法和正在引用"这个"控制器的对象。您最终使用vm.avengers访问视图中的数据。
  3. 正确。
  4. HTTP电话 - > getAvengersComplete - > getAvengers,所以纠正3个回调。