我有这样的工厂:
myapp.factory('JobOffersByCounteryFactory', function($http) {
var factory = {
getList: function() {
return $http.get('data/offres_par_pays.JSON')
.then(function(response) {
//....code
}, function(error) {
return 'There was an error getting data';
});
},
getHighestNumberOfOffers: function() {
var n = 0;
$http.get('data/offres_par_pays.JSON')
.then(function(response) {
n = Math.max.apply(Math, response.data['nb']);
}, function(error) {
return 'There was an error getting data';
});
return n;
}
};
return factory;
});
这个工厂将返回一个包含两个函数的对象,第二个函数将返回一个数组中的最大数字,在这种情况下response.data['nb']
在我的控制器中,我测试了这个功能:
console.log(JobOffersByCounteryFactory.getHighestNumberOfOffers());
但我总是得到值0
。
我试图将n
变量的某些数字影响为:n = 12;
但我总是得到值0
似乎n
的值变量在$http.get('data/offres_par_pays.JSON').then(function(response)
我该如何解决这个问题?
答案 0 :(得分:1)
您不能期望asynchronous
来电同步工作。因为你永远不知道什么时候会完成。
为了控制它,你会告诉async
来电已经完成或失败,这就是承诺。基本上$http.get
返回promise
个对象。
您应该从方法getHighestNumberOfOffers
返回一个承诺,在其上放置.then
函数,该函数将成功并在其中进行错误回调。
&安培;在承诺成功时,您需要返回新计算的变量值。
<强>代码强>
getHighestNumberOfOffers: function() {
var n = 0;
return $http.get('data/offres_par_pays.JSON')
.then(function(response) {
n = Math.max.apply(Math, response.data['nb']);
return n;
}, function(error) {
return 'There was an error getting data';
});
}
在执行console.log(JobOffersByCounteryFactory.getHighestNumberOfOffers())
时,您只会获得getHighestNumberOfOffers
返回的promise对象(根据上述建议)。为了获得准确的值,您应该将console.log
放在.then
服务方法的getHighestNumberOfOffers
函数中。
JobOffersByCounteryFactory.getHighestNumberOfOffers().then(function(n){
console.log(n)
});