阻止 AngularJS $http promise 返回缓存的 JSON 数据
Prevent AngularJS $http promise from returning cached JSON data
在我的 AngularJS 应用程序的注册过程中,我不断更新用户对象。
这可能是错误的做法,但我对所有这些注册步骤都使用了一个 "signup" 控制器(因为这些步骤中的逻辑非常相似,而且代码更简洁而不是为每个视图制作单独的 "signup1"、"signup2" 等控制器。
我承诺 returns userInfo
来自我的数据库:
.service('userInfo', function ($http, $cookies) {
var userId = $cookies.id;
console.log("UI Cookies", $cookies);
var promise = $http.get('/api/findProfile/' + userId, { cache: false}).
success(function (data) {
var userInfo = data;
console.log("This is fresh data!") // This logs the first time I load my page, but never again
return userInfo;
}).error(function(data) {
console.log("ERROR")
return userInfo
});
return promise;
})
从一个注册步骤转到下一个注册步骤时,我会在 MongoDB 上更新个人资料信息,然后加载下一页。如果我通过从我的控制器更改 $location('')
来加载页面,我会变旧 userInfo
,它还没有在我的数据库中更新。但是,如果我进行整页刷新,我会得到正确的更新 userInfo
.
这是缓存问题吗?我已尝试将 {cache: false}
传递给我的 $http
承诺,但我没有获得新数据(如 console.log("This is fresh data!")
所示;相反,我正在取回缓存数据。
除了在 Angular 中强制重新加载整页之外,我该如何解决这个问题?
这不是缓存问题,或者至少不是您的想法。
Services and factories are singletons in angular,这意味着它们在第一次被请求注入之前被初始化一次。之后服务函数就不会运行,所有的controller都会收到同一个对象。 (如果是服务,注入的对象是通过使用服务函数作为构造函数创建的)
如果你想在每次加载视图时轮询一些数据,你必须在控制器中初始化请求(无论如何你都可以通过服务来完成) - 它会在不重新加载浏览器的情况下重新初始化页。
此外,您似乎在使用承诺和 return 值时遇到了一些问题。从错误和成功处理程序中获取 return 是没有意义的,因为它们的 return 值将被丢弃。有关来自异步函数的 "returning" 的更多信息,请参阅 this discussion。
如果您只是 return 来自服务中函数的 $http
promise 可能是最简单的,然后每个控制器都可以适当地处理该 promise,最终将您的服务代码缩减为:
.service('userInfo', function ($http, $cookies) {
var userId = $cookies.id;
console.log("UI Cookies", $cookies);
//this function returns the promise returned by $http.get
this.getData = function(){
return $http.get('/api/findProfile/' + userId, { cache: false});
};
})
在我的 AngularJS 应用程序的注册过程中,我不断更新用户对象。
这可能是错误的做法,但我对所有这些注册步骤都使用了一个 "signup" 控制器(因为这些步骤中的逻辑非常相似,而且代码更简洁而不是为每个视图制作单独的 "signup1"、"signup2" 等控制器。
我承诺 returns userInfo
来自我的数据库:
.service('userInfo', function ($http, $cookies) {
var userId = $cookies.id;
console.log("UI Cookies", $cookies);
var promise = $http.get('/api/findProfile/' + userId, { cache: false}).
success(function (data) {
var userInfo = data;
console.log("This is fresh data!") // This logs the first time I load my page, but never again
return userInfo;
}).error(function(data) {
console.log("ERROR")
return userInfo
});
return promise;
})
从一个注册步骤转到下一个注册步骤时,我会在 MongoDB 上更新个人资料信息,然后加载下一页。如果我通过从我的控制器更改 $location('')
来加载页面,我会变旧 userInfo
,它还没有在我的数据库中更新。但是,如果我进行整页刷新,我会得到正确的更新 userInfo
.
这是缓存问题吗?我已尝试将 {cache: false}
传递给我的 $http
承诺,但我没有获得新数据(如 console.log("This is fresh data!")
所示;相反,我正在取回缓存数据。
除了在 Angular 中强制重新加载整页之外,我该如何解决这个问题?
这不是缓存问题,或者至少不是您的想法。
Services and factories are singletons in angular,这意味着它们在第一次被请求注入之前被初始化一次。之后服务函数就不会运行,所有的controller都会收到同一个对象。 (如果是服务,注入的对象是通过使用服务函数作为构造函数创建的)
如果你想在每次加载视图时轮询一些数据,你必须在控制器中初始化请求(无论如何你都可以通过服务来完成) - 它会在不重新加载浏览器的情况下重新初始化页。
此外,您似乎在使用承诺和 return 值时遇到了一些问题。从错误和成功处理程序中获取 return 是没有意义的,因为它们的 return 值将被丢弃。有关来自异步函数的 "returning" 的更多信息,请参阅 this discussion。
如果您只是 return 来自服务中函数的 $http
promise 可能是最简单的,然后每个控制器都可以适当地处理该 promise,最终将您的服务代码缩减为:
.service('userInfo', function ($http, $cookies) {
var userId = $cookies.id;
console.log("UI Cookies", $cookies);
//this function returns the promise returned by $http.get
this.getData = function(){
return $http.get('/api/findProfile/' + userId, { cache: false});
};
})