gpt4 book ai didi

AngularJS $资源拦截器

转载 作者:可可西里 更新时间:2023-11-01 15:07:15 28 4
gpt4 key购买 nike

如何将拦截器添加到 $resource 调用?

假设我有一个名为 Users 的资源工厂,就像这样;

app.factory('Users', ['$resource', 'resourceInterceptor',
function ($resource, resourceInterceptor) {
return $resource(
'users/:user_id',
{
user_id: '@id'
},
{
query: {
method: 'GET', // Not changing the default method, just adding an interceptor
interceptor: resourceInterceptor // Is there any better way to do this.. like globally?
},
save: {
method: 'POST', // Same here
interceptor: resourceInterceptor // Again...
},
..., // And so on
}
);
}]);

我的resourceInterceptor 服务看起来像;

app.factory('resourceInterceptor', ['$rootScope',
function ($rootScope) {
return {
request: function () {
// This function isn't executed at all?
$rootScope.loading = true;
},
response: function () {
$rootScope.loading = false;
},
responseError: function () {
$rootScope.loading = false;
}
};
}]);

首先,request拦截函数一直没有执行,为什么不呢?

其次,必须将拦截器硬编码到现有的 $resource 方法是非常乏味的,有没有一种方法可以更轻松地将拦截器分配给特定的 $resource 调用,或者甚至为所有 $resource 调用分配一个拦截器?

最佳答案

要在资源中使用拦截器,您应该:

1 - 用你的请求、响应、responseError 制作一个 httpInterceptor:

app.factory('myInterceptor', function () {
//Code
//return { request:...,
});

2 - 在您的应用中配置此拦截器:

app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push('myInterceptor');
}]);

现在,当您将 httpProvider 配置为在您注入(inject) $http 的任何地方都有一个拦截器时,您将使用此提供程序,因此...您将执行您的请求、响应和 responseError 函数。

3 - 在资源中使用它。由于 $resource 使用 $http 并且你已经配置了一个全局的 httpProvider 你将在你使用你的资源时调用你的拦截器的函数。

第二个问题:您不能将拦截器设置为具体的 $http 对象,它们(拦截器)是全局设置的。

(即使你在你的模块定义之前设置拦截器然后你删除它,你也无法知道执行顺序)

如果您不想覆盖每个 $resource 操作中的拦截器属性(如您在问题中所写),您可以做什么来改进您的拦截器。

app.factory('userLoadingInterceptor', function () {
//Code
return {
request: function(){
//Check if your are working with a url related with users
// and if so do things...
}
});

关于AngularJS $资源拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23224337/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com