2015-02-10 63 views
0

我正在使用相同的工廠方法進行兩次REST API調用以分隔URL。

這是我目前Angularjs代碼結構:

angular.module('evtApp', []) 

.controller('EventAppController', ['$scope', '$q', 'restApi', function($scope, $q, restApi) { 

    // var ajaxCall_1 = restApi.fetchData(tweetUrl), 
    // ajaxCall_2 = restApi.fetchData(instaUrl); 

    $q.all([restApi.fetchData(tweetUrl), restApi.fetchData(instaUrl)]).then(function() { 
     // Save the the return data values to the respective scopes. 
     // $scope.tweetUrl = data; 
     // $scope.instaUrl = data; 
    }); 

}]) 

.factory('restApi', ['$q', '$http', function($q, $http) { 
     var q = $q.defer(); 
     return { 
      fetchData: function(url) { 
       $http.jsonp(url).success(function(data) { 
        console.log(data); 
        q.resolve(data); 
       }).error(function(error) { 
        q.reject(error); 
       }); 
       return q.promise; 
      } 
     }; 
    }]) 

當我看網絡請求它表明,我已經取得了4次通話,而不是

樣的網絡調用的:

search?q=twitter,instagram,flicker&callback=angular.callbacks._3  
search?q=quotes:yes&callback=angular.callbacks._0 
search?q=twitter,instagram,flicker&callback=angular.callbacks._1 
search?q=quotes:yes&callback=angular.callbacks._2 

出了什麼問題?而且,如何獲取返回提要並將tweetURL調用保存到$ scope.tweetUrl,並將instaUrl調用保存到$ scope.instaUrl。 我知道jQuery $.when(func1, func2).done(function(func1data, func2data){});我得到.done()中各個調用的值。我怎樣才能做到以上的代碼。

+1

你可以包括你的.html呢?你可能有兩個EventAppController引用,每個都會創建一個$ scope。您可以通過將重複呼叫轉移到服務或工廠來避免重複呼叫。 – 2015-02-10 01:27:09

+0

感謝布拉德,我沒有意識到這可能是問題所在,我確實有兩個同名的ng-controller。謝謝 :)。問題第二部分的任何內容。 – Vish 2015-02-10 01:30:45

回答

2

對於第二部分,它除了它作爲一個數組是類似$。當電話:

$q.all([restApi.fetchData(tweetUrl), restApi.fetchData(instaUrl)]).then(function(data) { 
    // Save the the return data values to the respective scopes. 
    $scope.tweetUrl = data[0]; 
    $scope.instaUrl = data[1]; 
}); 
+0

這工作!我看到返回的數組返回的參數。 – Vish 2015-02-10 01:40:08

1

你需要做的

$q.all ([ajaxCall_1, ajaxCall_2, restApi.fetchData (instaUrl)]).then(function() {//success call back});

基本上你需要傳遞您剛纔創建的承諾目標。

希望這可以幫助你。謝謝。