2015-12-26 3 views
2

У меня есть завод, как это:вычислить максимальное значение в массиве

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

См [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous -call) и [Почему моя переменная неизменна после изменения ее внутри функции?] (http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it -inside-оф-а-функции-Asynchron). Короткий ответ заключается в том, что вы не можете вернуть 'n' на основе' response'. Хотя, Угловая уже имеет одно из общих предложений - '$ q' обещает. –

ответ

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 (согласно предложению выше). Для получения точного значения вы должны положить console.log внутри функции .thengetHighestNumberOfOffers метод обслуживания.

JobOffersByCounteryFactory.getHighestNumberOfOffers().then(function(n){ 
    console.log(n) 
}); 
+0

спасибо, что было полезно –

+0

Рад помочь вам .. Спасибо :) Спасибо :) –