Вложенные обещания Angular «Невозможно прочитать свойство «тогда» неопределенного»

Я вызываю службу внутри фабрики с контроллера. Затем служба вызывает другую службу, которая делает запрос $http для некоторого json. Затем первой службе необходимо изменить данные из json и вернуть их контроллеру. Я не могу понять, как вернуть данные в контроллер. Я получаю сообщение об ошибке «Невозможно прочитать свойство «тогда» неопределенного» о моем использовании then() внутри функции $scope.getModifiedData внутри моего контроллера. Контроллер знает о сервисе employeeFactory.modifyData(), потому что, если я удалю обещание и функциональность then(), он будет успешно вызван.

Я смотрел на это: https://docs.angularjs.org/api/ng/service/$q

Внутри моего контроллера:

$scope.getModifiedData = function() {
  var promise = employeesFactory.modifyData();
  promise.then(function(modifiedData) {
    console.log(modifiedData, 'modifiedData');
  });
};
$scope.getModifiedData();

Внутри моей фабрики:

var targetEmployeesAPI = 'http://sample.dev/api/employees.jsonp?callback=JSON_CALLBACK';

service.employeesRawData = function() {
  var deferred = $q.defer();
  $http({
    method: 'JSONP',
    url: targetEmployeesAPI
  }).success(function(data) {
    employeesRaw = data.employees;

    deferred.resolve(employeesRaw);
  }).error(function() {
    deferred.reject();
  });
  return deferred.promise;
};

service.modifyData = function() {
  var deferred = $q.defer();

  service.employeesRawData()
    .then(function(employeesRaw) {

      // Do stuff: Modify data from service.employeesRawData()
      // Eventually create object modifiedData
      modifiedData = {};

      if (modifiedData !== undefined) {
        deferred.resolve(modifiedData);
      } else {
        deferred.reject('Rejected');
      }

    return deferred.promise;
  });
};

person maskedjellybean    schedule 07.12.2014    source источник
comment
Я должен уточнить, что service.employeesRawData() успешно получает данные json, и я могу изменить их внутри service.modifyData(). Я просто не знаю, как вернуть объект данных контроллеру.   -  person maskedjellybean    schedule 07.12.2014


Ответы (1)


Просто замените его.

service.modifyData = function() {
  var deferred = $q.defer();

  service.employeesRawData()
    .then(function(employeesRaw) {

    ...

    return deferred.promise;
  });
};

on

service.modifyData = function() {
  var deferred = $q.defer();

  service.employeesRawData()
    .then(function(employeesRaw) {

      ...
  });

  return deferred.promise;
};
person Igor Semin    schedule 07.12.2014