Angular nested promises'无法读取属性'然后'未定义'

时间:2014-12-07 07:36:48

标签: angularjs angular-promise angular-http

我从控制器调用工厂内的服务。然后该服务调用另一个服务,该服务为某些json发出$ http请求。然后,第一个服务需要修改json中的数据并将其返回给控制器。我无法弄清楚如何将数据恢复到控制器。我收到错误'无法读取属性'然后'未定义的'关于我在我的控制器里面的$ scope.getModifiedData函数中使用then()。控制器确实知道了employeesFactory.modifyData()服务,因为如果我删除promise和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;
  });
};

1 个答案:

答案 0 :(得分:1)

只需更换它。

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

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

    ...

    return deferred.promise;
  });
};

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

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

      ...
  });

  return deferred.promise;
};