Angular promises - 无法读取未定义的属性

Aft*_*ess 1 angularjs

我试图在视图中显示promise的结果,但是我得到了这个例外.我在Google/SO上发现的此异常的其他情况是由我在代码中看不到的错误引起的.

我已经验证我正在使用promises,我正在解决传递给$ timeout的函数内部的promise,我从函数getData()返回promise,而不是解析promise的函数.

提前致谢.

查看器

<html ng-app="controller" ng-controller="MyController as controller">
<head>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.min.js"></script>
  <script type="text/javascript" src="controller.js"></script>
  <script type="text/javascript" src="services.js"></script>
</head>
<body>
  {{data}}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

控制器(controller.js)

   angular.module('controller', ['services'])
    .controller('MyController', ['MyService', function(MyService) {

      MyService.getData().then(function(data) {
        $scope.data = data;
      });
    }]);
Run Code Online (Sandbox Code Playgroud)

服务(services.js)

angular.module('services', [])
.factory('MyService', function($q, $timeout){
  var getData = function getData() {

    var deferred = $q.defer;

    $timeout(function () {
      deferred.resolve('Foo');
    }, 5000);

    return deferred.promise;
  };

  return {
    getData: getData
  };
});
Run Code Online (Sandbox Code Playgroud)

异常堆栈跟踪

TypeError: Cannot read property 'then' of undefined
    at new <anonymous> (controller.js:5)
    at Object.e [as invoke] (angular.js:4219)
    at $get.x.instance (angular.js:8525)
    at angular.js:7771
    at q (angular.js:334)
    at M (angular.js:7770)
    at g (angular.js:7149)
    at angular.js:7028
    at angular.js:1460
Run Code Online (Sandbox Code Playgroud)

PSL*_*PSL 7

您没有正确获取延迟对象,而deferred变量保存函数引用,您错过了延迟构造函数的调用.

var deferred = $q.defer();
                        ^___Missing this
Run Code Online (Sandbox Code Playgroud)

还要注意,你可以$timeout按原样返回,因为它返回一个promise.在您的实际情况下,如果您只使用$http返回$ http promise而不是使用延迟模式创建冗余的promise对象.

.factory('MyService', function($q, $timeout){
  var getData = function getData() {

    return $timeout(function () {
        return 'Foo' ;
    }, 5000);
  };

  return {
    getData: getData
  };
Run Code Online (Sandbox Code Playgroud)