我一直在看我不久前制作的应用程序,有一个特定的页面,其中最后加载了详细信息。因此,它似乎正在排队请求(之前有超过 6 个请求(,这导致页面变慢。
我想我可以找到一个解决方案来优先考虑这些请求,我发现这个:
如何在角度$http服务中确定请求的优先级?
所以我创建了我的版本并将其添加到我的拦截器中:
// Add our auth interceptor to handle authenticated requests
$httpProvider.interceptors.push('authInterceptor');
$httpProvider.interceptors.push('httpPriorityInterceptor');
拦截器如下所示:
function factory($injector, $q) {
var requestStack = [], // request stack
$http = null; // http service to be lazy loaded
return {
request: request,
responseError: responseError
};
//////////////////////////////////////////////////
function request(config) {
// Lazy load $http service
if (!$http) {
$http = $injector.get('$http');
}
if (!config.hasBeenRequested) {
config.hasBeenRequested = true;
config.priority = config.priority || 3;
console.log(config);
// add a copy of the configuration
// to prevent it from copying the timeout property
requestStack.push(angular.copy(config));
// sort each configuration by priority
requestStack = requestStack.sort(sort);
// cancel request by adding a resolved promise
config.timeout = $q.when();
}
// return config
return config;
}
function responseError(rejection) {
// check if there are requests to be processed
if (requestStack.length > 0) {
requestStack.reduceRight(function(promise, config) {
return promise.finally(function() {
return $http(config);
});
}, $q.when());
requestStack.length = 0;
}
// return rejected request
return $q.reject(rejection);
}
//////////////////////////////////////////////////
function sort(config1, config2) {
return config1.priority < config2.priority;
}
}
问题是,它似乎也在拦截模板请求。我对此没有问题,但他们没有解决。相反,我得到很多错误:
错误: [$templateRequest:tpload] 无法加载模板: app/accounts/accounts.html (HTTP 状态: -1 (
以前有人遇到过这种情况吗?我能做些什么来解决这个问题吗?
你应该知道每个请求,如HTML文件,CSS文件和...进入拦截器。在您的情况下,您无需确定此文件的优先级。因此,您可以像以下方式过滤您的请求:
if (config.url.toString().toLowerCase().includes("api")) {
//place your functionality
}