AngularJS - обработка асинхронных данных в сервисе

Я хочу получить некоторые асинхронные данные в сервисе, которые должны быть там обработаны. Код здесь на PLNKR,

Я моделирую асинхронный вызов с тайм-аутом, и после получения данных пользовательский интерфейс обновляется. Но мне также нужно обрабатывать данные в службе (doubleData) и позже использовать их в моем пользовательском интерфейсе. Скажем, мне нужно дополнить данные некоторыми подробностями.

Поскольку данные являются нулевыми, когда {{doubleData()}} называется, это никогда не населяет это. Как мне добиться дальнейшей обработки данных в моем сервисе (который заполняется асинхронно - скажем, $ http)?

index.html

<!doctype html>
<html ng-app="myApp"> 
    <head>
        <script type="text/javascript" src="../../../angular-1.0.2/angular.js"></script>
        <script type="text/javascript" src="script.js"></script>
    </head>
    <body>
        <div ng-controller="MainCtrl">
            {{data}}<br>
            {{doubleData()}}
        </div>
    </body>
</html>

script.js

var app = angular.module('myApp',[]);

app.factory('myService', function($timeout) {
  var data = [],
      doubleData = [];

  var myService = {};
  myService.async = function() {
    $timeout(function(){
        data.length = 0;
        for(var i = 0; i < 10; i++){
            data.push({val: Math.random()});                        
        }
    }, 5000); 
  };
  myService.data = function() { return data; };
  myService.doubleData = function() { 
    doubleData = []
    for (var i = 0; i < data.length; i++) {
        doubleData.push({val: 10* data[i]});   
    };    
    return doubleData;                 
  };

  return myService;
});

app.controller('MainCtrl', function( myService,$scope) {
  myService.async();
  $scope.data = myService.data();
  $scope.doubleData = myService.doubleData;

});

Выход (через 5 сек):

[{"val":0.4908415926620364},{"val":0.25592787051573396},{"val":0.8326190037187189},{"val":0.6478461190126836},{"val":0.8502937415614724},{"val":0.19280604855157435},{"val":0.06115643493831158},{"val":0.5100495833903551},{"val":0.4134843284264207},{"val":0.5548313041217625}]
[{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null},{"val":null}]

1 ответ

Решение

Похоже, что ваша проблема - опечатка в цикле for, к которому вам нужно получить доступ data[i].val:

for (var i = 0; i < data.length; i++) {
    doubleData.push({val: 10* data[i].val});   
};

Другой способ сделать это (без отслеживания изменений в переменных) - привязать doubleData так же, как вы привязаны к data и вызвать функцию в вашем асинхронном обратном вызове, чтобы очистить и заполнить doubleData с рассчитанным значением. Смотрите этот plnkr для примера.

Другие вопросы по тегам