(function () {
angular.module('Testing')
.controller('Testing', Testing);
Testing.$inject('$q', '$location', 'authentication');
function Testing($q, $location, authentication) {
var vm = this;
function asyncGreet(name) {
return $q(function (resolve, reject) {
setTimeout(function(){
if(username){
resolve('Hello, ' + username);
}
else {
reject('Greeting ' + name + 'is not allowed');
}
}, 3000)
});
}
var promise = asyncGreet("oo");
promise.then(function (greeting) {
console.log('Success: ' + greeting);
}, function (reason) {
console.log('Failed: ' + reason);
});
} ());
我正在使用角度版本1.2.9,我正在尝试使用$ q,并且我不断收到错误,说$ q不是函数,。
有人可以指出我做错了什么吗?谢谢。
答案 0 :(得分:1)
$q
!== Promise
。我不知道$ q何时被改为一个函数,但在1.2.9之后我非常肯定。你之所以使用这么旧的版本?
尝试此变体:
var deferred = $q.defer();
setTimeout(function(){
if(username){
deferred.resolve()
} else {
deferred.reject()
}
});
return deferred;
查看您的版本的文档(至少在1.3之前)
答案 1 :(得分:1)
我正在使用角度版本1.2.9,我正在尝试使用
$q
,并且我一直收到错误消息,指出$q
不是函数,。
发生错误是因为在AngularJS V1.3中引入了使用$q
进行承诺的ES6样式。有关详细信息,请参阅Github commit - feat($q): add streamlined ES6-style interface for using $q.
我建议使用$timeout service:
,而不是使用function asyncGreet(name) {
̶r̶e̶t̶u̶r̶n̶ ̶$̶q̶(̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶r̶e̶s̶o̶l̶v̶e̶,̶ ̶r̶e̶j̶e̶c̶t̶)̶ ̶{̶
̶s̶e̶t̶T̶i̶m̶e̶o̶u̶t̶(̶f̶u̶n̶c̶t̶i̶o̶n̶(̶)̶{̶
return $timeout(function () {
if(username){
return ('Hello, ' + username);
}
else {
return $q.reject('Greeting ' + name + 'is not allowed');
}
}, 3000);
});
制作承诺
$timeout
AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流程。这将JavaScript拆分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才能受益于AngularJS数据绑定,异常处理,属性监视等。
$timeout
service是AngularJS的window.setTimeout包装器。 fn函数被包装到try / catch块中,并将任何异常委托给$exceptionHandler
service。
调用{{1}}的返回值是一个promise,它将在延迟过去后解析,并且执行超时函数(如果提供)。
有关详细信息,请参阅AngularJS $timeout Service API Reference。
答案 2 :(得分:0)
注释中出现错误
Testing.$inject('$q', '$location', 'authentication')
应该是
Testing.$inject = ['$q', '$location', 'authentication']
链接到doc