AngularJS V1.2 - Error: $q is not a function

AngularJS V1.2 - Error: $q is not a function

(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);
});

} ());

我正在使用 angular 版本 1.2.9,我正在尝试使用 $q,但我一直收到一个错误消息,提示 $q 不是一个函数,。

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

如评论中所述,注入存在错误

Testing.$inject('$q', '$location', 'authentication')

应该是

Testing.$inject = ['$q', '$location', 'authentication']

link 到 doc

$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

I am using angular version 1.2.9, and i am trying to make use of $q, and i keep getting an error that says $q is not a function, .

错误的发生是因为在AngularJS V1.3中引入了ES6风格的$q承诺。有关详细信息,请参阅 Github commit - feat($q): add streamlined ES6-style interface for using $q.

我建议使用 $timeout service:

,而不是使用 $q 来制造承诺
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);
});

AngularJS 通过提供自己的事件处理循环来修改正常的 JavaScript 流程。这将 JavaScript 分为经典和 AngularJS 执行上下文。只有在 AngularJS 执行上下文中应用的操作才能受益于 AngularJS 数据绑定、异常处理、属性 监视等

$timeout service is AngularJS's wrapper for window.setTimeout. The fn function is wrapped into a try/catch block and delegates any exceptions to $exceptionHandler service.

调用$timeout的return值是一个promise,会在延迟时间过去并执行超时函数(如果提供)时执行。

有关详细信息,请参阅 AngularJS $timeout Service API Reference