我提供服务的时间可能超过一分钟并返回一些数据。 这里是服务代码的一部分。
var deferred = $q.defer();
//check data is in cache
//if not, some process (take some time)
deferred.resolve( data);
});
return deferred.promise;
并尝试在连续的两个js文件中使用此服务。这是调用服务的js代码的一部分。
myService.get().then( function( data) { //works });
这就是它的工作方式。
加载A.js - >服务负载 - >获取数据(需要一些时间) - >保存数据 缓存 - > process A.js - > load B.js - >服务负载 - >从中获取数据 缓存 - >过程B.js
但由于A.js和B.js文件几乎同时加载,这就是目前的工作方式。
加载A.js - >服务负载 - >获取数据(需要一些时间) - >同时加载B.js - >服务负载 - > 获取数据(需要一段时间)重复加载数据 - > ...
如果其中一个已经使用过服务,我应该如何处理A.js或B.js服务呢?
答案 0 :(得分:1)
我最近也遇到了同样的问题。以下是我为解决这个问题所做的工作。
这个想法是创建一个标志来识别http请求是否仍在进行中,并使用$ timeout重试,直到前一个请求得到解决。在重试之前,将立即返回延迟对象,但稍后会解决。
这样的事情,在您的服务中: -
var httpInProgress = false; // used to identify if a request is still in progress
//this is your service method
service.loadData = function(yourParam, defer, shouldNotReturn){
if(!defer){
defer = $q.defer();
}
if(httpInProgress){
//if http already in progress, retry again with the same defer object.
$timeout(function(){service.loadData(yourParam, defer, true);}, 100);
if(!shouldNotReturn){
//return a promise but resolve later when we actual deal with http
return defer.promise;
}
}else{
//do normal stuff if no http in progress
service.sendActualRequest();
}
};
service.sendActualRequest = function(yourParam, defer){
httpInProgress = true;
$http(request).then(function(res){
defer.resolve(res);
}, function(err){
defer.reject(err);
}).finally(function(){
httpInProgress = false;
});
return defer.promise;
};