2016-02-10 3 views
1

У меня есть полезная информация, которую я отправляю в API. Я вызываю метод, который вызывает API от моего контроллера, как так:AngularJS. Then of undefined

arisService.getVarStatData(
       JSON.stringify($scope.payload), 
       JSON.stringify($scope.config.index_info), 
       field, 
       stat 
       ) 
       .then(function (data) { 

        $scope.varStat = data; 

        console.log("var stat data", $scope.varStat); 
       }); 

В моей службе, так как поле является массивом, то у меня есть для цикла толкающего значения массива полезной нагрузки, а затем призывающее функция с полезной нагрузкой в ​​качестве параметра:.

function getVarStatData(payload, index, field, stat) { 

     for (var i = 0; i < field.length; i++) { 
      if (field[i]) { 

       var varStatData = { 
        user_selection: payload, 
        index_info: index, 
        field: field[i], 
        statistic: stat 

       }; 

       postStatData(varStatData); 

      } 
     } 
    } 

    function postStatData(varStatData){ 
     var deferred = $q.defer(); 

     $http({ 
      url: 'API', 
      method: "POST", 
      data: $.param(varStatData), 
      headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
     }).then(function (response) { 
      var varStat = response.data; 

      console.log("variable stat response data", varStat); 

      deferred.resolve(varStat); 
     }); 

     return deferred.promise; 

    } 

Теперь я могу совершенно получить данные в моей службе, но в моем контроллере я получаю сообщение об ошибке «не может прочитать свойство .then неопределенных Изначально я не был не решая обещаний с использованием $ q, поэтому я сделал это и подумал, что это сделало бы работу, но не повезло. Любая помощь приветствуется!

ответ

1

Если вы хотите сделать что-то после того, как несколько асинхронных вызовов функции вы можете использовать .all().

function getVarStatData(payload, index, field, stat) { 
    var promises = []; 
    for (var i = 0; i < field.length; i++) { 
     if (field[i]) { 

      var varStatData = { 
       user_selection: payload, 
       index_info: index, 
       field: field[i], 
       statistic: stat 

      }; 

      promises.push(postStatData(varStatData)); 

     } 
    } 
    return $q.all(promises); 
} 

all обещание получает решено с массивом резолюций обещаний он получил. См. Документацию на этой странице - https://docs.angularjs.org/api/ng/service/ $ q

+0

Это действительно устранило ошибку «.then undefined», но мои данные возвращаются как «неопределенные» ... любые мысли ? Я снова проверил свои полезные данные и хорошо смотрю, когда он будет отправлен. Данные регистрируются, как ожидалось, в моем сервисе, но как только он попадает на мой контроллер, его неопределенный ... @ Brannon Heftel –

+0

также, я записал обещание, которое возвращается, а данные в нем также не определены ... это в service –

+0

Извините за задержку - вы все еще регистрируете переменную varStat? вы посмотрели на ответ или просто на ответ. data? –

1

Проблема заключается в том, что объект обещания не возвращается из метода getVarStatData, поэтому вам необходимо вернуть функцию postStatData из метода getVarStatData.

function getVarStatData(payload, index, field, stat) { 
    var result = [], promise; 
    for (var i = 0; i < field.length; i++) { 
    if (field[i]) { 
     var varStatData = { 
     user_selection: payload, 
     index_info: index, 
     field: field[i], 
     statistic: stat 

     }; 
     promises.push(postStatData(result)); 
    } 
    } 
    //this will call the data method once all postStatData is accomplished 
    return $q.all(promises); 
} 
+0

Это разбивает цикл for и возвращает только данные первого элемента –

+0

@AnishS. так как, глядя на код, он выглядит как работающий таким образом. Если индекс соответствует возвратным данным ,, Если нет, то как вы хотели заставить его работать. Пожалуйста, добавьте этот контент в вопрос. –

+0

@AnishS. Помогло ли обновление? –

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