gpt4 book ai didi

javascript - 在 Angular js 中实现缓存服务时的 $timeout 保证

转载 作者:行者123 更新时间:2023-12-03 11:48:55 25 4
gpt4 key购买 nike

我正在实现自己的缓存,因为我需要它了解我的应用程序的语义。我正在访问 REST 服务的客户端 API 中实现缓存。逻辑很简单:我首先查看自己的对象字典,如果请求的对象不存在,那么我使用网络从 REST 服务请求对象。即使请求的对象在我的缓存中,使用客户端 API 的代码也将期望得到一个 promise 。我的问题是:为缓存中的对象实现 promise /延迟模式的最佳方法是什么?现在我正在使用超时函数来做到这一点。超时功能是否足够好:?我如何保证超时函数将在 API 用户收到 Promise 对象后执行?要了解我的问题的详细信息,请参阅下面的代码:

简化代码以仅显示与问题相关的内容:

angular.module("myApp").factory("restClient", function($q, $http, $timeout, cache){

var get_content=function(link){
var deferred=$q.defer();
$http.get(link)
.success(function (data) {
deferred.resolve(data);
deferred=null;
})
.error(function (error) {
deferred.reject(error);
deferred=null;
});

return deferred.promise;
};

return{

getObject : function(objectId) {
//If object is in the cache
if (cache.contains(objectId)){

var deferred=$q.defer();
$timeout(function (){

var objectContent=cache.get(objectId);
deferred.resolve(objectContent);
deferred=null;

});
return deferred.promise;


}
else{

//Create link
//return promise
return get_content(link);
}
}
});

最佳答案

对于您想要做的事情,一件重要的事情是当您已经拥有返回 promise 的对象时,不要创建冗余的延迟 promise 对象,例如:- $http$timeout 。你可以这样做:-

 var get_content=function(link){
return $http.get(link)
.then(function (response) {
cache.put(link, response.data);
return response.data;
}, function(response){
return $q.reject(response.data);
});

};

return {

getObject : function(objectId) {
//If object is in the cache
if (cache.contains(objectId)){
return $q.when(cache.get(objectId))
}
return get_content(objectId);
}

或者更好的是,您可以将 Promise 本身放入缓存中,而不是将数据放入缓存中。

   getObject : function(objectId) {
if (cache.contains(objectId)){
return cache.get(objectId);
}

var promise = $http.get(objectId)
.then(function (response) {
//Incase you have any condition to look at the response and decide if this is a failure then invalidate it here form the cache.
return response.data;
}, function(response){
cache.remove(objectId); //Remove it
return $q.reject("Rejection reason");
});
}
cache.put(objectId, promise);
return promise;

关于javascript - 在 Angular js 中实现缓存服务时的 $timeout 保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com