- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在有一个拦截器来处理我的 $http 错误。它看起来有点像这样:
.factory('RequestsErrorHandler', ['$q', '$injector', '$rootScope', 'ErrorService', function ($q, $injector, $rootScope, service) {
var specificallyHandled = function (specificallyHandledBlock) {
specificallyHandleInProgress = true;
try {
return specificallyHandledBlock();
} finally {
specificallyHandleInProgress = false;
}
};
var responseError = function (rejection) {
// Create the variable for handling errors
var shouldHandle = (rejection && rejection.config && rejection.config.headers && rejection.config.headers['handle-generic-errors']);
// If we should handle an error
if (shouldHandle) {
// Get our error
var error = service.process(rejection);
// Assign our error to the rootScope
$rootScope.serverError = error;
// Redirect to our error screen
$injector.get('$state').transitionTo('error');
}
// Fallback, reject the promise
return $q.reject(rejection);
};
return {
specificallyHandled: specificallyHandled,
responseError: responseError
};
}])
.config(['$httpProvider', '$provide', function ($httpProvider, $provide) {
$httpProvider.interceptors.push('RequestsErrorHandler'); // Add our interceptor to handle http requests
// Decorate $http to add a special header by default
function addHeaderToConfig(config) {
config = config || {};
config.headers = config.headers || {};
// Add the header unless user asked to handle errors himself
if (!specificallyHandleInProgress) {
config.headers['handle-generic-errors'] = true;
}
return config;
}
// The rest here is mostly boilerplate needed to decorate $http safely
$provide.decorator('$http', ['$delegate', function ($delegate) {
function decorateRegularCall(method) {
return function (url, config) {
return $delegate[method](url, addHeaderToConfig(config));
};
}
function decorateDataCall(method) {
return function (url, data, config) {
return $delegate[method](url, data, addHeaderToConfig(config));
};
}
function copyNotOverriddenAttributes(newHttp) {
for (var attr in $delegate) {
if (!newHttp.hasOwnProperty(attr)) {
if (typeof ($delegate[attr]) === 'function') {
newHttp[attr] = function () {
return $delegate.apply($delegate, arguments);
};
} else {
newHttp[attr] = $delegate[attr];
}
}
}
}
var newHttp = function (config) {
return $delegate(addHeaderToConfig(config));
};
newHttp.get = decorateRegularCall('get');
newHttp.delete = decorateRegularCall('delete');
newHttp.head = decorateRegularCall('head');
newHttp.jsonp = decorateRegularCall('jsonp');
newHttp.post = decorateDataCall('post');
newHttp.put = decorateDataCall('put');
copyNotOverriddenAttributes(newHttp);
return newHttp;
}]);
}])
.factory('RequestsErrorHandler', ['ErrorService', 'toastr', function (service, toastr) {
var specificallyHandled = function (specificallyHandledBlock) {
specificallyHandleInProgress = true;
try {
return specificallyHandledBlock();
} finally {
specificallyHandleInProgress = false;
}
};
var responseError = function (rejection) {
// Create the variable for handling errors
var shouldHandle = (rejection && rejection.config && rejection.config.headers && rejection.config.headers['handle-generic-errors']);
// If we should handle an error
if (shouldHandle) {
// Get our error
var error = service.process(rejection);
// Display the error
toastr.error(error);
}
// Fallback, reject the promise
return $q.reject(rejection);
};
return {
specificallyHandled: specificallyHandled,
responseError: responseError
};
}])
Circular dependency found: $http <- $templateRequest <- $$animateQueue <- $animate <- toastr <- RequestsErrorHandler <- $http <- $templateFactory <- $view <- $state
我不确定如何解决这个问题,有其他人知道吗?
最佳答案
有两种简单的方法可以解决这种循环依赖问题
toastr
服务(或在使用 toastr 的服务中),在根范围内监听这些事件并显示它们。 $injector.get('toastr')
. 关于AngularJS httpInterceptors 和 toastr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946379/
在我的应用程序中,身份验证基于 JWT token 。为了使它们无效,我在 JWT 中放置了一个随机安全字符串,并将完全相同的字符串存储在数据库中,与拥有 token 的用户相关联。这两个必须匹配 J
我编写了一个 HttpInterceptor(Angular 4.3.6)来捕获所有请求并操作一些头字段。我的问题是它没有捕捉到每个请求。可能是什么问题呢? 这是我的拦截器: import {Inje
如果满足特定条件,我必须在拦截器中调用另一个服务,并且我希望原始服务等待新服务完成。我的第一个解决方案是使用 Tap: intercept(req: HttpRequest, options: any
我有一个 HttpInterceptor,我希望它能重构我的错误以删除括号。 @Injectable() export class AuthInterceptor implements HttpInt
我正在编写使用 IndexedDB 缓存数据的 Angular 应用程序。 每当应用程序即将对服务器进行特定的 http 调用时我想从 IndexedDB 检索此数据并丰富或替换来自服务器的响应。 问
在 HttpInterceptor 中捕获到 401 错误时是否可以导航到特定路由? 我尝试做的是: intercept(req: HttpRequest, next: HttpHandler): O
我正在使用 Angular 4.3.1 和 HttpClient。有一个 HttpInterceptor 来设置一些 header 。 在某些 http get 请求中,我需要设置不同的 header
我想要实现的目标 一个封装的应用程序(表单编辑器),我可以在另一个 Angular 应用程序中使用,也可以在任何 Web 应用程序中使用。 想法 主要模块/组件可以实现为 Angular 库(主要组件
此拦截器的目标是在服务器需要验证码 key 时重新发送请求。 但是在应该刷新 jwt token 时可以使用它。 拦截器工作正常,但我无法解释测试失败的原因。 如果响应代码 != 200,流将永远不会
我在 HttpInterceptor 的响应中缺少 http header 。我可以得到一个正文,但不能得到标题。请参阅附加的输出和我的代码。 @Injectable() export class A
我有一个带有 HttpInterceptor 的 Angular 应用程序,它捕获 http 错误以显示一些对话框,这对我的所有应用程序都是通用的。 我想禁用某些特定调用的拦截器,但我更喜欢禁用调用
我在为 Angular 7 应用程序中的子模块注册 HttpInterceptor 时遇到问题。我的意图是只拦截和调整从子模块执行的请求。拦截器的代码如下。 import {Injectable} f
@Injectable() export class MyInterceptor implements HttpInterceptor { intercept(req : HttpReques
我目前正在将我的 Angular 应用程序切换到通用 ssr 应用程序。我的最后一个问题是我的自定义 HttpInterceptor 触发了两次。我正在检查 api 调用的 http 响应代码,如果有
我现在有一个拦截器来处理我的 $http 错误。它看起来有点像这样: .factory('RequestsErrorHandler', ['$q', '$injector', '$rootScope'
是否可以从 HttpInterceptor 调用组件中的函数? @Injectable() export class HttpResponseInterceptor implements HttpIn
是否有可能在执行 rxjs 的一些可管道运算符后拦截 HttpClient get 请求。在我的例子中,我有一个自动生成的 http 服务,它将 blob 响应转换为对象。我的全局错误拦截器也需要转换
我编写了一个 Angular (4.3.6) HttpInterceptor 来添加一些 header 字段,但如果我在调试器中检查它们,则 header 不会更新。有什么想法吗? import {I
Angluar 5 HttpInterceptor 如何在出错时重试请求? Angular 文档没有显示 HttpInterceptor 重试的示例: https://angular.io/guide
我有一个全局 HttpInterceptor,它带有一个处理 HttpErrorResponse 的 catch block 。但我的要求是,当服务进行 http 调用并且还有错误处理程序时,我希望服
我是一名优秀的程序员,十分优秀!