未知提供者:AngularJS应用程序中的$ q

时间:2016-02-23 18:14:20

标签: javascript html angularjs

任何人都可以告诉我我可能做错了什么。我有这段代码:

var app = angular.module('app',
[
    'angular-cache',
    'angular-loading-bar',
    'ngAnimate',
    'ngCookies',
    'pascalprecht.translate',
    'ui.router',
    'ui.bootstrap'  
])

app.config([
    '$httpProvider',
    '$q',
    ($httpProvider,
        $q) => {
    $httpProvider.interceptors.push(
        function () {
            return {
                'request': function (config) {
                    return config;
                },
                // optional method
                'requestError': function (rejection) {
                    return $q.reject(rejection);
                },
                // optional method
                'response': function (response) {
                    return response;
                },
                // optional method
                'responseError': function (rejection) {
                    return $q.reject(rejection);
                }
            }
        })
}])

当它运行时,我收到消息:

  

未捕获错误:[$ injector:modulerr]无法实例化模块应用   由于:错误:[$ injector:unpr]未知提供者:$ q   http://errors.angularjs.org/1.5.0/ $注射器/ unpr?P0 =%24Q       在http://localhost:1828/lib/angular/angular.js:68:12       在http://localhost:1828/lib/angular/angular.js:4397:19       at getService(http://localhost:1828/lib/angular/angular.js:4550:39)       at injectionArgs(http://localhost:1828/lib/angular/angular.js:4574:58)       at Object.invoke(http://localhost:1828/lib/angular/angular.js:4596:18)       at runInvokeQueue(http://localhost:1828/lib/angular/angular.js:4497:35)       在http://localhost:1828/lib/angular/angular.js:4506:11       at forEach(http://localhost:1828/lib/angular/angular.js:321:20)       在loadModules(http://localhost:1828/lib/angular/angular.js:4487:5)       在createInjector(http://localhost:1828/lib/angular/angular.js:4409:19)   http://errors.angularjs.org/1.5.0/ $注射器/ modulerr P0 =应用&安培; P1 =错误%3A%20%...%20(HTTP%3A%2F%2Flocalhost%3A1828%2Flib%2Fangular%2Fangular.js%3A4409%3A19)

当我注释掉所有这些代码并运行我的应用程序时,它可以工作,我不会收到此错误消息。

3 个答案:

答案 0 :(得分:4)

您可以将服务注入配置块。但是您可以使用函数的工厂服务作为拦截器。已有工厂示例,因此我将提供另一个功能解决方案:

app.config(['$httpProvider', ($httpProvider) => {
    $httpProvider.interceptors.push(['$q', function($q) {
        return {
            'request': function(config) {
                return config;
            },
            // optional method
            'requestError': function(rejection) {
                return $q.reject(rejection);
            },
            // optional method
            'response': function(response) {
                return response;
            },
            // optional method
            'responseError': function(rejection) {
                return $q.reject(rejection);
            }
        }
    }])
}])

答案 1 :(得分:3)

您只能将提供程序注入配置块,因为它在加载任何服务之前运行。 $q是一项服务,因此在该代码块运行时未定义。

答案 2 :(得分:1)

您不能将$httpProvider.interceptors作为提供者注入。相反,在工厂中定义拦截器,然后将其推送到config内的.config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('testInterceptor'); }]); 。请注意以下内容......

.factory('testInterceptor', ['$q', function($q) {

    return {
        'request': function (config) {
             return config;
         },
         'requestError': function (rejection) {
             return $q.reject(rejection);
         },
         'response': function (response) {
             return response;
         },
         'responseError': function (rejection) {
              return $q.reject(rejection);
         }
    }
}]);
b

JSFiddle Link - 演示