gpt4 book ai didi

javascript - Angular 服务缓存

转载 作者:行者123 更新时间:2023-12-03 10:29:53 25 4
gpt4 key购买 nike

我正在尝试将 $http 的响应缓存到 Angular session 的对象中,因此一旦进行了初始调用,对 service.getCategories() (例如)的每个其他调用都会从对象而不是 API。

服务正在路由处解析,但存在身份验证,这将重定向到另一个路由 - 再次调用 service.getCategories()。

我尝试通过在调用时设置一个 init 变量来尝试此操作,然后所有其他调用都将定向到填充的对象 - 但它似乎以某种方式重置服务,并且返回的对象被填充两次,因此所有内容都是双倍的。见下文:

var $ = require('jquery');

module.exports = angular.module('app.common.services.category', [])
.factory('categoryService', ['$http', '$q', '$rootScope', function($http, $q, $rootScope) {

// API Parameters
var deferred = $q.defer();

// Services
var Categories = {

init: false,
categories: [],
index: 0,

// Retrieve all data on load.
// Loaded into an array for all other services
// to use after init.
getCategories: function(page) {

if(!Categories.init) {

$http.get('api/core/get_category_index')
.then(function(result) {

var data = result.data.categories;

$.each(data, function(i, category) {
category.index = Categories.index;
Categories.categories.push(category);
Categories.index++;
});

Categories.init = true;

return deferred.resolve(Categories.categories);

});

// Return promise once catgories is resolved
return deferred.promise;

} else {


return Categories.categories;

}

},

allCategories: function() {

return Categories.categories;

}

}

return Categories;

}]);

最佳答案

您的方法的一个问题是,当第二次调用服务函数 getCategories 时,第一次服务器请求可能无法得到解决,从而导致对服务器的第二次调用。因此,您应该在函数调用 getCategories 之后直接移动 init 标志。

另一个问题是,在您的情况下,您不知道该函数是否会返回 promise 或数组。我建议始终返回一个数组

module.exports = angular.module('app.common.services.category', [])
.factory('categoryService', ['$http', '$q', '$rootScope', function($http, $q, $rootScope) {

//API参数 var 延迟;

//服务 var 类别 = {

        categories: [],
index: 0,

// Retrieve all data on load.
// Loaded into an array for all other services
// to use after init.
getCategories: function(page) {

if(!deferred) {

// replacement for intit flag
deferred = $q.defer();

$http.get('api/core/get_category_index')
.then(function(result) {

var data = result.data.categories;

$.each(data, function(i, category) {
category.index = Categories.index;
Categories.categories.push(category);
Categories.index++;
});


deferred.resolve(Categories.categories);

});


}

// always return a promise
return deferred.promise;



},

allCategories: function() {

return Categories.categories;

}

}

return Categories;

}]);

也许您可以通过 promise 返回服务本身。然后你可以在任何地方写这样的内容:

myService.load().then(
function success(theService) {
theService.allCategories()
}
);

现在服务是否之前加载已经不再重要

关于javascript - Angular 服务缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29262548/

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