Javascript 如何在应用程序中同步HTTP请求?
我已经实现了一个cacheService,它具有方法get(url),该方法从HTTP获取值,将其放入localStorage并返回$q。在下一次运行.get(url)时,它从localStorage获取值,并返回用$q包装的值Javascript 如何在应用程序中同步HTTP请求?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我已经实现了一个cacheService,它具有方法get(url),该方法从HTTP获取值,将其放入localStorage并返回$q。在下一次运行.get(url)时,它从localStorage获取值,并返回用$q包装的值 function get(url){ var saved = JSON.parse(localStorage.getItem(url)); if (angular.isObject(saved)){ return $q.when(save
function get(url){
var saved = JSON.parse(localStorage.getItem(url));
if (angular.isObject(saved)){
return $q.when(saved);
}
return $http.get(url).then(function(xhr){
localStorage.setItem(url, JSON.stringify(xhr.data));
return xhr.data;
});
}
这里有一个例子,当我的方法不起作用时——它发出了不止一个HTTP请求
如果我调用cacheService.get(url)两次(例如,从不同的模块):
- 当它第一次运行时,在localStorage中找不到缓存值并发出HTTP请求
- 当它在第一次之后第二次运行时,第一个HTTP请求尚未完成,其结果值尚未缓存。所以我的方法第二次发出HTTP请求
- 定义
var currentRequests={}代码>
- 如果localStorage具有缓存值,则返回该值
- 如果
为空,执行请求并设置currentRequests[url]
-将承诺存储在currentRequests[url]=$http.get(url)
- 如果
不是空的,那么这个请求现在正在运行,那么只需currentRequests[url]
李>返回currentRequests[url]
你觉得怎么样?这可能不是个好办法。但是你可以试一试 我建议你遵守一系列的承诺
var promiseArr = [];
function get(url){
var saved = JSON.parse(localStorage.getItem(url));
if (angular.isObject(saved)){
return $q.when(saved);
}
//check if $http request for the url has a pending promise.
if(!promiseArr.hasOwnProperty(url)){
promiseArr[url] = $http.get(url).then(function(xhr){
localStorage.setItem(url, JSON.stringify(xhr.data));
delete promiseArr[url]; //Delete the promise once resolved.. please check.
return xhr.data;
});
}
return promiseArr[url]; //return the promise from the array.
}
我不确定这是否有帮助,但看看
$httpProvider.interceptors
你想同步所有请求还是只将请求同步到同一个url?@AmanGautam当然只是将请求同步到同一个url。每个url有一个。另外,请参见问题中的UPD。是的,它是线程安全的。。因为服务
在整个应用程序中只实例化一次。是的,服务是单线程的,可以从不同的线程运行。据我所知,js在浏览器中的单个线程中运行。但是nodejs呢?nodejs
?角度通常在前端。。您如何将其与nodejs
code一起使用……我不知道,只是想:-)