2017-05-31 78 views
0

我在我的應用程序有一個小問題。我想獲取並返回匿名函數外的數據數組。我使用承諾,瞄準我的問題是當我嘗試我的服務時,它返回一個隨機數組長度隨機。獲取數據承諾angularJS

我不知道這個問題,我不知道我是否使用了諾言。

getCurrentExchangeTo : function(year, month, country){ 

      var def = $q.defer(); 

      var numberDayPerMonth = [ 
       31, 
       9, 
       31, 
       30, 
       31, 
       30, 
       31, 
       30, 
       31, 
       30, 
       31, 
       30, 
      ]; 

      var vm = this; 
      this.country = country; 

      this.getCurrentExchangeFor = []; 
      var hello = "gello" 

      for(var i = 0; i < numberDayPerMonth.length; i++){ 
       if((i + 1) === month){ 
        for(let j = 1; j < numberDayPerMonth[i]; j++){ 
         $http.get('http://api.fixer.io/2000-02-0' + j + '?symbols=USD').then(function (success) { 
          let countryDay = vm.country         
          vm.getCurrentExchangeFor[j] = success.data.rates[countryDay]; 
          def.resolve(getCurrentExchangeFor) 
         }); 
        } 
       } 
      } 
      return def.promise 
     } 

getCurrentExchangeService.getCurrentExchangeTo(2015, 2, 'USD').then(function (data) { 
     console.log(data) 
    }); 
+0

JavaScript是異步..當u調用循環繼續,並保持調用API的API。每次通話在不同的時間返回..所以你得到隨機數字... – ziaulain

+0

這個權利..但你有一個想法的結果我的問題?? – simonmnt

+0

您的退貨聲明應出現在您的循環中的解決說明之後。 –

回答

3

你過於複雜的事情。

特別是,外環不是必需的,延期也不是。

$http.get()顯然迴避承諾,可以推到一個數組,並最終與$q.all()彙總。

據我所知,您希望以下內容:

getCurrentExchangeTo: function(year, month, country) { 
    var numberDayPerMonth = [ 31, 29, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30 ]; 
    var promises = []; 
    for(let i=1; i<=numberDayPerMonth[month-1]; i++) { 
     promises.push($http.get('http://api.fixer.io/2000-02-0' + i + '?symbols=USD').then(function(response) { 
      return response.data.rates[country]; 
     })); 
    } 
    return $q.all(promises); 
} 
+0

它的工作,非常感謝你 – simonmnt

+0

你需要檢查'numberDayPerMonth'數組 - 4月,6月,9月和11月有31天,此外,對於二月份,[參照這個答案](https://stackoverflow.com/a/16353241/3478010),你可以寫成'[...,leapYear(year)?29:28,...]'。 –