我们使用$ 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#。
答案 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;
这是如何运作的:
isRetrievingData
为false,请启动请求并将isRetrievingData
设置为true isRetrievingData
为真,则表示正在进行另一个调用,所以不要做任何事情,只需在数组中添加延迟当唯一的呼叫结束时,要向每个呼叫者发送数据,您只需解决waitingDeferred
阵列中已注册的每个延迟呼叫。
这对你有好处吗?