Angularjs 如何防止向服务器发送相同的请求?

Angularjs 如何防止向服务器发送相同的请求?,angularjs,promise,Angularjs,Promise,我拥有具有缓存值的控制器和服务 app.service('nameService',['$q','$http',函数($q,$http){ var=这个; that.name=null; this.index=函数(){ var deferred=$q.deferred(); if(that.name!==null){ //火烧值 控制台日志(“已兑现”); 延迟。解决(该。名称); }否则{ $http.get('/api/name')。成功( 功能(响应){ //对服务器的已激发请求 lo

我拥有具有缓存值的控制器和服务

app.service('nameService',['$q','$http',函数($q,$http){
var=这个;
that.name=null;
this.index=函数(){
var deferred=$q.deferred();
if(that.name!==null){
//火烧值
控制台日志(“已兑现”);
延迟。解决(该。名称);
}否则{
$http.get('/api/name')。成功(
功能(响应){
//对服务器的已激发请求
log('server');
that.name=response.name;
延迟。解决(该。名称);
}
);
}
回报。承诺;

}])你可以用下一种方法来做

app.service('nameService',['$q','$http',函数($q,$http){
var=这个;
that.nameDeffered=null;
this.index=函数(){
if(that.nameDeffered==null){
that.nameDeffered=$q.defer();
$http.get('/api/name')。成功(
功能(响应){
//对服务器的已激发请求
log('server');
that.nameDeffered.resolve(response.name);
}
);
}
返回该.nameffered.promise;
}
}]);
如何防止向服务器发送相同的请求

好的,您可以将
$http.get('/api/name')
更改为
$http.get('/api/name',{cache:true})
,这实际上是内置在Angular中的,可以正常工作

这带来了一个有趣的问题,即如何在不使用Angular的帮助的情况下实现一般承诺-同样简单:

this._data = null;
this.index = function() { 
    return this._data || (this._data = $http.get('/api/name'));
}
这样,如果缓存了,它将返回左侧,如果没有,它将缓存右侧


重要的是我们缓存了承诺,而不是数据。这是您一直缺少的“技巧”。

stackoverflow.com/questions/23803743/what-is-The-explicit-promise-construction-antipattern-and-how-do-i-avoid-itIf author需要缓存所有返回$http.get('/api/name')的响应我们可以在if语句that.nameDeffered=$http.get('/api/name')中编写类似的内容;但他只想缓存response.name。这就是我创建新的deffered的原因。这完全不需要-看看我的答案,看看没有它如何实现它。是的,我看了你的答案,但你的代码并不像原始作者代码那样。所以如果你使用你的服务:nameService.index().success(函数(结果){console.log(结果);});您将在控制台中看到如下内容:{姓名:'bob',年龄:24岁,电子邮件:'example@example.com}。但是如果您使用author方法,您将在控制台“Bob”中看到。这就是区别。因此
。然后(x=>x.name)
可以添加到我的答案中的代码中…创建延迟只是误解承诺。例如,您的代码-没有正确处理服务器错误。不是重复的,因为这是关于缓存http响应的。正确的方法是传递
{cache:true}
而不缓存承诺。