代码之家  ›  专栏  ›  技术社区  ›  JVG

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

  •  3
  • JVG  · 技术社区  · 10 年前

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

    这可能是错误的做法,但我在所有这些注册步骤中都使用了一个“注册”控制器(因为步骤中的逻辑都非常相似,这会使代码更整洁,而不是为每个视图单独创建一个“签名1”、“签名2”等控制器)。

    我有一个回报的承诺 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('') 从我的控制器,我变老了 用户信息 我的数据库中还没有更新。但是,如果我进行完整的页面刷新,我会得到正确的、更新的 用户信息 .

    这是缓存问题吗?我试过传球 {cache: false} 到我的 $http 承诺,但我没有得到新的数据(如 console.log("This is fresh data!") ; 相反,我正在取回缓存的数据。

    除了在Angular中强制重新加载整个页面之外,我如何解决这个问题?

    1 回复  |  直到 10 年前
        1
  •  4
  •   Community CDub    8 年前

    这不是缓存问题,或者至少不是你想的那样。

    Services and factories are singletons in angular ,这意味着它们在第一次被请求注入之前被初始化一次。之后,服务功能将不运行,所有控制器将接收相同的对象。 (对于服务,注入的对象是通过将服务函数用作构造函数来创建的)

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


    此外,您似乎在使用承诺和返回值方面存在一些问题。从错误和成功处理程序返回没有意义,因为它们的返回值将被丢弃。看见 this discussion 有关从异步函数“返回”的更多信息。

    如果您只返回 $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});
      };
    })