2014-11-03 65 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