我试图在视图中显示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>
控制器(controller.js)
angular.module('controller', ['services'])
.controller('MyController', ['MyService', function(MyService) {
MyService.getData().then(function(data) {
$scope.data = data;
});
}]);
服务(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
};
});
异常堆栈跟踪
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
答案 0 :(得分:7)
您没有正确获取延迟对象,而deferred
变量保存函数引用,您错过了对延迟构造函数的调用。
var deferred = $q.defer();
^___Missing this
另请注意,您可以按原样返回$timeout
,因为它会返回一个承诺。在您的实际案例中,如果您使用$http
,只需返回$ http promise,而不是使用deferred pattern创建冗余的promise对象。
.factory('MyService', function($q, $timeout){
var getData = function getData() {
return $timeout(function () {
return 'Foo' ;
}, 5000);
};
return {
getData: getData
};