2015-08-07 2 views
0

Это мой путь:Как обрабатывать данные, когда обещание в цикле?

var activeArr = []; 
var activeDate = []; 
var day = (endDate - startDate)/(24 * 60 * 60 * 1000); 
for (var i = 1; i < day + 1; i++) { 
    activeDate.push(endDate - (24 * 60 * 60 * 1000) * i); 

    var start = endDate - (24 * 60 * 60 * 1000) * i; 
    var end = endDate - (24 * 60 * 60 * 1000) * (i - 1); 

    statisService.getRegStatis(start, end).then(function(data) { 
     activeArr.push(data); 
     if(activeArr.length == day){ 
      var active = []; 
      for(var j=0;j<activeArr.length;j++){ 
       var obj = {}; 
       obj.date = activeDate[j]; 
       obj.data = activeArr[j].data; 
       active.push(obj); 
      } 
      $scope.active = active; 
     } 
    }); 
} 

служба:

userServiceModule.factory('statisService', ['$http', 'serverUrl', function($http, serverUrl) { 
return { 
    getRegStatis: function(startDate, endDate) { 
     var url = serverUrl + "/adminDA/dbReport?startTime=" + startDate + "&endTime=" + endDate; 
     return $http.get(url).then(function(result) { 
      return result.data; 
     }); 
    } 
}; 

Я хочу поставить дату и данные в один объект, так что я могу использовать его в представлении, как это:

<tr ng-repeat="item in active track by $index"> 

Цикл for не будет ждать завершения всех вызовов службы. Поэтому я обрабатываю данные в цикле for, и я думаю, что это не очень хорошо, но я не знаю, как это сделать быть олучатель.

+0

отредактировать свой ответ и добавил}, мы надеемся, в нужном месте. Не зная возвращаемого значения 'data' (это массив?) И не зная, возвращает ли функция statisService.getRegStatis promis, у нас не будет достаточно информации, чтобы дать вам хороший ответ. Я бы сомневался, что метод 'then' будет вызываться несколько раз, чтобы заполнить' activeArr'. Возможно, 'data' является массивом. то вы можете использовать его вместо 'activeArr' –

+0

@PeterPaulKiefer спасибо, но вы его отредактировали неправильно. Я обновлю служебную функцию –

+0

Теперь} снова отсутствует. Просто используйте 'return $ http.get (url)' без разрешения обещания с 'then (function (...'. Возвращаемое значение является promis. И используйте данные вместо массива activeArr. Я считаю, что данные - это массив, с сервера http call. –

ответ

2

Вы должны использовать менеджер обещание $ q.defer(), из отложенного API.

$ q.defer() получить 2 метода:

  • решительность (значение): которые разрешить наш ассоциированный обещание, дав ей окончательное значение

  • отклонять (причина): которые разрешают ошибку обещания.

Кроме того $ q.all() взять обещание массив в качестве параметра, и решить все из них.

Контроллер

(function(){ 

function Controller($scope, Service, $q) { 

    var promises = []; 

    var defer = $q.defer(); 

    //Process loop 
    for (var i = 0; i < 20; ++i){ 
    //Fill my promises array with the promise that Service.post(i) return 
    promises.push(Service.post(i)); 
    } 

    //Resolve all promise into the promises array 
    $q.all(promises).then(function(response){ 
    //Create arr by maping each data field of the response 
    var arr = response.map(function(elm){ 
     return elm.data; 
    }); 
    //Resolve my data when she is processed 
    defer.resolve(arr); 
    }); 

    //When the data is set, i can get it 
    defer.promise.then(function(data){ 
    //Here data is an array 
    console.log(data) 
    }); 

} 

angular 
.module('app', []) 
.controller('ctrl', Controller); 

})(); 

Сервис

(function(){ 

    function Service($http){ 


    function post(num){ 
     //Just an example, I've pass an object, and just return it then 
     return $http.post('path_to_url', {id:num}); 
    } 

    var factory = { 
     post: post 
    }; 

    return factory; 

    } 

    angular 
    .module('app') 
    .factory('Service', Service); 

})(); 
+0

Я изменил свой код, как вы предложили, он работает, спасибо вам большое, и я многому научился. –

+0

Что здесь вяжется? – Tisha

+0

@ Тиша, если вы говорите о **. map() **, операция elm in .map() относится к каждому полю данных нашего массива обещаний, поэтому обещание. Мы создаем новый массив, извлекая поле данных каждого обещания, затем мы разрешаем обещание с этим новым массивом. –

Смежные вопросы