getHighestNumberOfOffers

getHighestNumberOfOffers

This question already has answers here:
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
                                
                                    (6个答案)
                                
                        
                                3年前关闭。
            
                    
我有一个像这样的工厂:

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)内部没有变化

我该如何解决?

最佳答案

您不能期望asynchronous调用能够同步工作。因为您永远都不知道何时完成。

为了控制它,您会说出async调用已完成或失败,这就是承诺。基本上$http.get具有返回promise对象。
您应该从方法getHighestNumberOfOffers中返回一个Promise,将.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)
});

09-05 14:26