在AngularJS中实现拦截器

时间:2014-06-09 17:02:32

标签: angularjs authentication

从这个有用的answer查看此AuthInterceptor,返回的JSON对象中如何使用requestresponse密钥?

此外,return config || $q.when(config)的含义是什么?我了解如果confignullundefined,但$q.when(config)在此代码中的含义是什么,则会返回第二部分?

myApp.factory('AuthInterceptor', function ($window, $q) {
    return {
        'request': function(config) {
            config.headers = config.headers || {};
            if ($window.sessionStorage.getItem('token')) {
                config.headers.Authorization = $window.sessionStorage.getItem('token');
            }
            return config || $q.when(config);
        },
        'response': function(response) {
            if(response.status === 401) {
                $location('/login');
            }
            return response || $q.when(response);
        }
    };
});

我输入了以上链接的答案。它对我有用,但我不明白它是如何使用的。

2 个答案:

答案 0 :(得分:1)

requestresponse很容易用作中间人。换句话说,request函数在请求之前(请求之后)运行,response函数在处理请求结果之前运行。


$q.when()确保返回值能够作为promise处理。从本质上讲,它将值包含在promise中,以便像returnedValue.then()这样的函数可以工作。

请参阅:https://docs.angularjs.org/api/ng/service/$q

凯文问你为什么要使用$q.when()。这是为了确保任何消耗这个功能的外部函数都能获得一个承诺,如果期望的那样。例如,假设您调用一个期望承诺的函数的情况:

someThirdPartyFunc(someArg).then(function(result){
    // do somethign with result
});

如果你运行了这个并且someThirdPartyFunc返回了一个简单的值(比如100),那么这显然会失败。如果实现者将返回值包装在$q.when(100)中,那么上面的函数调用将是有效的,而result将包含值100。

答案 1 :(得分:1)

注册$http拦截器时,基本上应该使用以下(可选)键传递一个对象:request,requestError,response,responseError。 有关何时调用每个拦截器功能的更多信息,请查看 this answer

$q.when()将任何JS对象转换为promise(使用传入的对象作为每个已解析的值立即解析)。但是,坦率地说(尽管我已经看过很多)我不明白为什么人们需要返回config || $q.when(config),而不仅仅是config