Angular服务缓存一个值

use*_*965 5 javascript promise angularjs parse-platform angularjs-service

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

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

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;

});
Run Code Online (Sandbox Code Playgroud)

一些注意事项:(1)我将缓存的属性命名为_currentYear,添加下划线以避免与函数名冲突.不确定我是否需要这样做.(2)当缓存值时,我返回一个履行的承诺,因此函数总是返回一个promise ...也不确定是否需要它,但认为它不会受到伤害.

PSL*_*PSL 3

与其缓存数据,为什么不缓存 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");
        });
    };
});
Run Code Online (Sandbox Code Playgroud)

  • 1)感谢您的回答,2)缓存承诺以避免竞争条件的好主意(我也将在其他地方使用它),3)我刚刚发现我的问题与adobe括号nodejs服务器有关(当我手动运行一个时,它起作用了),但我将把它标记为正确,因为它很有帮助(并且不会在问题中放置问号)。 (2认同)