AngularJS V1.2 - 错误:$ q不是函数

时间:2017-11-17 23:35:31

标签: angularjs q

(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不是函数,。

有人可以指出我做错了什么吗?谢谢。

3 个答案:

答案 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之前)

https://code.angularjs.org/1.2.32/docs/api/ng/service/$q

答案 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