2013-11-15 48 views
8

我仍然在學習角JS和具有該控制器被做兩個Ajax請求使用不同的參數LastFM等API。我想知道,當每個請求已經完成,這樣我就可以顯示兩個請求負載指標。我研究它,瞭解承諾和$ Q服務,但不能讓我圍繞如何將其納入這個頭。有沒有更好的方法來設置它?我怎麼能知道每個請求完成。謝謝。Angularjs多個Ajax請求優化

angular.module('lastfm') 

.controller('ProfileCtrl', function ($scope, ajaxData, usersSharedInformation, $routeParams) { 

    var username = $routeParams.user; 

    //Get Recent tracks 
    ajaxData.get({ 
     method: 'user.getrecenttracks', 
     api_key: 'key would go here', 
     limit: 20, 
     user: username, 
     format: 'json' 
    }) 

    .then(function (response) { 

     //Check reponse for error message 
     if (response.data.message) { 
      $scope.error = response.data.message; 
     } else { 
      $scope.songs = response.data.recenttracks.track; 
     } 

    }); 

    //Get user info 
    ajaxData.get({ 
     method: 'user.getInfo', 
     api_key: 'key would go here', 
     limit: 20, 
     user: username, 
     format: 'json' 
    }) 

    .then(function (response) { 

     //Check reponse for error message 
     if (response.data.message) { 
      $scope.error = response.data.message; 
     } else { 
      $scope.user = response.data.user; 
     } 

    }); 
}); 

我有這樣的工廠使用$q.all()負責處理所有的請求

angular.module('lastfm') 

.factory('ajaxData', function ($http, $q) { 

return { 
    get: function (params) { 
     return $http.get('http://ws.audioscrobbler.com/2.0/', { 
      params : params 
     }); 
    } 
} 

}); 

回答

16

很容易。 $http本身返回承諾,$q.all()不會解決,直到承諾的陣列解決

var ajax1=ajaxData.get(....).then(....); 
var ajax2=ajaxData.get(....).then(....); 

$q.all([ajax1,ajax2]).then(function(){ 
    /* all done, hide loader*/ 
}) 
+0

啊非常感謝,是有道理的 – Allan

+5

高興它爲你工作... 10個月後 – charlietfl