阻止AngularJS $ http promise返回缓存的JSON数据

时间:2015-08-05 07:46:31

标签: javascript json angularjs angular-promise angular-http

在我的AngularJS应用程序的注册过程中,我不断更新用户对象。

这可能是错误的做法,但我使用了一个"注册"所有这些注册步骤的控制器(因为步骤中的逻辑非常相似,它使得更整洁的代码而不是为每个代码制作一个单独的" signup1",#34; signup2" etc控制器图。

我有一个从我的数据库返回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中的整页重新加载外,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

这不是缓存问题,或者至少不是您的想法。

Services and factories are singletons in angular,意味着在第一次请求注入之前,它们会被初始化一次。之后,服务功能将无法运行,所有控制器都将收到相同的对象。 (在服务的情况下,通过使用服务函数作为构造函数创建注入的对象)

如果要在每次加载视图时轮询某些数据,则必须在控制器中初始化请求(无论如何都可以通过服务执行此操作) - 这会在不重新加载浏览器页面的情况下重新初始化。

此外,您似乎在使用promises和返回值时遇到了一些问题。从错误和成功处理程序返回没有意义,因为它们的返回值将被丢弃。有关从异步函数“返回”的更多信息,请参阅this discussion

如果您只是从服务中的函数返回$http承诺,那么这可能是最简单的,然后每个控制器都可以适当地处理承诺,最终将服务代码减少到此:

.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});
  };
})