【问题标题】:Angular service cache a valueAngular 服务缓存一个值
【发布时间】:2015-01-02 20:49:49
【问题描述】:

我的服务需要异步检索一个值,但一旦我拥有它,我想使用该值的缓存版本。

当两个控制器调用此服务时,我希望第一个控制器缓存检索到的值,而第二个控制器使用缓存值,但根据日志,我从未找到缓存值。当它运行时,我看到一条日志消息,显示正在缓存的值,然后,当我按照角度路由到不同的控制器时,我看不到服务找到缓存的值。为什么它没有按我的预期运行**?**

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) 当值被缓存时,我返回一个已履行的承诺,所以该函数总是返回一个承诺......也不确定是否需要,但认为它不会受到伤害。

【问题讨论】:

  • 那么到底是什么问题?
  • 它在代码下方的问题中说明。我将问题部分移到代码上方
  • 检查过其他类似的问题吗? stackoverflow.com/questions/15100020/…
  • 您没有在任何地方提出问题。这一点从没有问号就已经很清楚了。但是,如果您没有获得缓存命中,可能仅仅是因为 Config._currentYear 直到两个调用都被执行之后才被分配一些值(即 then() 函数返回一个承诺,所以两个调用可能已经在 @ 987654324@ 在分配新值之前。)
  • @ochi 在建议的副本中,答案似乎是页面重新加载时缓存的值丢失了。我的应用正在使用角度路由,并且在不重新加载页面的情况下出现问题。

标签: javascript angularjs parse-platform promise angularjs-service


【解决方案1】:

与其缓存数据,不如直接缓存 Promise 并返回它。当您缓存数据时,您仅在成功回调中设置数据Config._currentYear,并且有可能在成功回调运行之前发生其他后续调用。所以你最终再次拨打同样的电话。当您从被实例化的不同控制器调用相同的服务方法时,您可以很容易地看到这一点,因为它们存在于同一模板上。预先缓存一个 Promise 可以避免这些问题。

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");
        });
    };
});

【讨论】:

  • 1) 感谢您的回答,2) 缓存承诺以避免竞争条件的好主意(我也将在其他地方使用它),3) 我刚刚发现我的问题与 adobe 括号 nodejs 服务器有关(当我手动运行一个时,它可以工作),但我将把它标记为正确,因为它很有帮助(而不是迂腐地在问题中放置问号)。
  • @user1272965 不客气。很高兴它有一些帮助。您可以添加的另一件事是使 catch 块中的缓存承诺无效。只是这样你就不会总是在缓存中保留失败的承诺。是的,缓存 Promise 可以减少代码行数,否则在缓存数据时您必须这样做,毕竟 Promise 只是数据的代理。
  • @user1272965 如果您认为我(和其他人)很迂腐,我很抱歉。这对您来说可能看起来如此,但这仅仅是因为当人们没有完全弄清楚他们的问题是什么并且人们花费(无用的)时间来解决不存在的问题时,我们取得了一些经验。所以在这里非常清楚是有希望的,我希望你不要对 SO 社区产生偏见。但我很高兴 PSL 也认为比赛条件是问题的核心:)
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 2020-01-08
  • 2014-04-29
相关资源
最近更新 更多