有多个呼叫在Angular上的相同承诺上等待

问题描述:

我在使用相同服务的页面上有多个控制器,为了举例,我们将调用服务USER。有多个呼叫在Angular上的相同承诺上等待

第一次调用USER.getUser()时,它会执行$ http请求以获取用户的数据。通话结束后,它将数据存储在USER.data中。如果对USER.getUser()进行另一个调用,它将检查USER.data中是否有数据,如果有数据,则返回而不是进行调用。

我的问题是对USER.getUser()的调用发生得如此之快以至于USER.data没有任何数据,因此它再次触发$ http调用。

以下是我对用户的工厂现在:

.factory("user", function($http, $q){ 
    return { 
     getUser: function(){ 
      var that = this; 
      var deferred = $q.defer(); 
      if(that.data){ 
       deferred.resolve(that.data); 
      } else { 
       $http.get("/my/url") 
       .success(function(res){ 
        that.data = res; 
        deferred.resolve(that.data); 
       }); 
      } 
      return deferred.promise; 
     } 
    } 
}); 

我希望我的问题是有道理的。任何帮助将非常感激。

这是否适合您?

.factory("user", function($http, $q) { 
     var userPromise; 

     return { 
      getUser: function() { 
       if (userPromise) { 
        return userPromise; 
       } 

       userPromise = $http 
        .get("/my/url") 
        .then(function(res) { 
         return res.data; 
        }); 

       return userPromise; 
      } 
     } 
    }) 
+0

“变种userPromise = $ HTTP” 删除了var – 2015-04-02 19:49:52

+0

是否有一个名字为这种模式?这是一个很好的。我忽略了很长一段时间,直到我注意到重新使用控制器意味着多次调用相同的服务。 – 2017-02-01 20:34:53

+1

@MuraliVP你现在也可以从参数中删除$ q :) – obey 2017-08-21 08:28:59

$http已经返回给你的承诺,更是在2种有用的类型:成功&错误。所以基本上,@ kfis提供的选项不会捕获错误并且不灵活。 你可以写一些简单的:

.factory('user', function($http) { 
    return { 
     getUser: function() { 
      $http.get('/my/url/') 
      .success(function(data) { 
       return data; 
      }) 
      .error(function(err) { 
       // error handler 
      }) 
     } 
    } 
})