$ cacheFactory使用自定义服务

时间:2015-12-21 12:29:07

标签: javascript angularjs

我们使用$ cacheFactory来获取一些配置和用户数据一次 像

var cache = $cacheFactory("Temp");

    var getCachedData = function (url) {

        var data = cache.get(url);

        var deferred = $q.defer();

        if (data) {
            deferred.resolve(data);
        } else {
            readFromServer(url).then(function(result) {
                cache.put(url, result);
                deferred.resolve(result);
            });
        }
        return deferred.promise;
    };

    return {
        GetCachedData: getCachedData
    };

如果服务获取数据为null然后它调用服务器ow它将从Cache返回数据但是如果第二次调用是四拳完成然后他给服务器调用那么我们如何使用 lock 之类的JavaScript中的C#。

1 个答案:

答案 0 :(得分:1)

为了避免多次调用相同的API,你需要制作类似的东西(我没有测试,但这应该有效):



var isRetrievingData = false;
var waitingDeferred = [];

var getData = function (url) {
    var data = cache.get(url);

    var deferred = $q.defer();

    if (data) {
        deferred.resolve(data);
    } else if (isRetrievingData) {
        waitingDeferred.push(deferred);
    } else {
        isRetrievingData = true;
        waitingDeferred.push(deferred);
      
        readFromServer(url).then(function(result) {
            cache.put(url, result);
            
            for(var i = 0; i < waitingDeferred.length; i++) {
                waitingDeferred[i].resolve(result);
            }
        });
    }
    return deferred.promise;
};
&#13;
&#13;
&#13;

这是如何运作的:

  • 如果数据已经缓存,只需通过解析延迟
  • 返回
  • 如果数据未缓存且isRetrievingData为false,请启动请求并将isRetrievingData设置为true
  • 如果数据未缓存且isRetrievingData为真,则表示正在进行另一个调用,所以不要做任何事情,只需在数组中添加延迟

当唯一的呼叫结束时,要向每个呼叫者发送数据,您只需解决waitingDeferred阵列中已注册的每个延迟呼叫。

这对你有好处吗?

相关问题