2

我嘗試請求服務中的某些數據。我想確保數據保存在服務的變量中,因爲由於狀態的改變,我的控制器會一直重新加載,並且只有在網站加載時我才需要數據。從服務獲取異步數據

app.service('resultDeals',['$translate','$cookies','$http', 
    function($translate,$cookies,$http) { 

     var currentOrigin = {}; 
     var originsUser={}; 

     return { 

     loadOrigins:function() { 
      $http.get('app/deals/deal.json').success(function(response){ 
      console.log(response); 
      originsUser = response.data; 
      return originsUser 
      }).error(function(err){ 
      console.log(err); 
      }); 
     }, 
     userOrigin:originsUser 

     }; 

    }]); 

和我的控制器看起來如下

console.log(resultDeals.loadOrigins()); 
    $scope.updateOrigins=resultDeals.loadOrigins(); 

的問題是,resultDeals.loadOrigins()永遠是不確定的。

我想確保將從loadOrigins()獲得的數據存儲在服務變量中,並且只在需要時才從控制器訪問它,以便在不必再獲取控制器重新加載數據的時候。

我該怎麼做?

回答

2

不要使用.success & .error回調函數,因爲他們沒有任何回報的能力,因此他們無法繼續承諾鏈。在$http.get方法中使用.then(它返回一個promise對象)。這將有能力return data而承諾已resolvedreject承諾。您可以從控制器方法繼續promise鏈。

服務

return { 
    loadOrigins: function() { 
     return $http.get('app/deals/deal.json') 
      .then(function(response) { 
      console.log(response); 
      originsUser = response.data; 
      return originsUser 
      }, function(err) { 
      console.log(err); 
      }); 
    }, 
    userOrigin: originsUser 
}; 

控制器

resultDeals.loadOrigins().then(function(user){ 
    $scope.updateOrigins= user; 
}, function(){ 
    console.log("Errror occurred.") 
}) 
+0

感謝您的回覆。那不會返回'$ http.get(...)。然後(...)。錯誤不是函數'? – Dribel

+0

@ user3383709因爲'.then'沒有'.error'方法.. –

+0

絕對正確...感謝您的幫助 – Dribel

2

當您使用異步代碼時,您必須處理promise。 loadOrigins必須返回一個承諾,您的控制器必須使用它。

app.service('resultDeals',['$translate','$cookies','$http', '$q', 
function($translate,$cookies,$http,$q) { 

    var currentOrigin = {}; 
    var originsUser={}; 

    return { 

    loadOrigins:function() { 
     var deferred = $q.defer(); 

     $http.get('app/deals/deal.json').success(function(response){ 
     console.log(response); 
     originsUser = response.data; 
     deferred.resolve(originUser), 
     }).error(function(err){ 
     console.log(err); 
     deferred.reject(); 
     }); 

     return deferred.promise; 
    }, 
    userOrigin:originsUser 
    }; 

}]); 

// In controller 
resultDeals.loadOrigins().success(function(updateOrigins) { 
    $scope.updateOrigins = updateOrigins; 
}).error(function() { 
    console.log('bad !'); 
}); 
+0

無需創建'$ q.defer()的;''爲$ http.get'已經返回承諾 –

+0

如果他想要返回response.data而不是響應,您必須使用其他承諾。不是? – Magus

+0

nope ..你可以從'.then'函數返回,就像我做的那樣..承諾鏈將繼續 –