Angular服务缓存一个值
Angular service cache a value
我的服务需要异步检索一个值,但一旦我有了它,我想使用该值的缓存版本。
当两个控制器调用此服务时,我希望第一个缓存检索到的值,第二个使用缓存的值,但根据日志,我从未找到缓存的值。当它运行时,我看到一条日志消息显示正在缓存的值,然后,当我按照 angular 路由到另一个控制器时,我没有看到该服务找到缓存值。为什么没有按照我的预期运行**?**
angular.module('myApp.services').factory('Config', function() {
var Config = { };
Config.currentYear = function() {
if (Config._currentYear) {
// sadly, we never execute here
console.log("returning cached year");
return Parse.Promise.as(Config._currentYear);
}
return Parse.Config.get().then(function(config) {
console.log("caching year");
Config._currentYear = config.get("currentYear");
return Config._currentYear;
});
};
return Config;
});
一些注意事项:(1)我将缓存属性命名为_currentYear,添加下划线以避免与函数名称冲突。不确定我是否需要这样做。 (2) 当值被缓存时,我 return 一个已实现的承诺,所以函数总是 return 一个承诺......也不确定是否需要,但认为它不会伤害。
为什么不直接缓存 promise 和 return 而不是缓存数据。当您缓存数据时,您仅在成功回调中设置数据 Config._currentYear
,并且有可能在成功回调 运行 之前发生其他后续调用。所以你最终又打了同样的电话。当您从实例化的不同控制器调用相同的服务方法时,您可以很容易地看到这一点,因为它们存在于同一模板上。预先缓存承诺将避免这些问题。
angular.module('myApp.services').factory('Config', function() {
var config; //Just use to save the promise
Config.currentYear = function() {
/*If there is already a call made before return the promise else
make the actual call and store the promise in the variable.*/
return config || config = Parse.Config.get().then(function(config) {
return config.get("currentYear");
});
};
});
我的服务需要异步检索一个值,但一旦我有了它,我想使用该值的缓存版本。
当两个控制器调用此服务时,我希望第一个缓存检索到的值,第二个使用缓存的值,但根据日志,我从未找到缓存的值。当它运行时,我看到一条日志消息显示正在缓存的值,然后,当我按照 angular 路由到另一个控制器时,我没有看到该服务找到缓存值。为什么没有按照我的预期运行**?**
angular.module('myApp.services').factory('Config', function() {
var Config = { };
Config.currentYear = function() {
if (Config._currentYear) {
// sadly, we never execute here
console.log("returning cached year");
return Parse.Promise.as(Config._currentYear);
}
return Parse.Config.get().then(function(config) {
console.log("caching year");
Config._currentYear = config.get("currentYear");
return Config._currentYear;
});
};
return Config;
});
一些注意事项:(1)我将缓存属性命名为_currentYear,添加下划线以避免与函数名称冲突。不确定我是否需要这样做。 (2) 当值被缓存时,我 return 一个已实现的承诺,所以函数总是 return 一个承诺......也不确定是否需要,但认为它不会伤害。
为什么不直接缓存 promise 和 return 而不是缓存数据。当您缓存数据时,您仅在成功回调中设置数据 Config._currentYear
,并且有可能在成功回调 运行 之前发生其他后续调用。所以你最终又打了同样的电话。当您从实例化的不同控制器调用相同的服务方法时,您可以很容易地看到这一点,因为它们存在于同一模板上。预先缓存承诺将避免这些问题。
angular.module('myApp.services').factory('Config', function() {
var config; //Just use to save the promise
Config.currentYear = function() {
/*If there is already a call made before return the promise else
make the actual call and store the promise in the variable.*/
return config || config = Parse.Config.get().then(function(config) {
return config.get("currentYear");
});
};
});