2015-04-02 52 views
4

我在使用相同服務的頁面上有多個控制器,爲了舉例,我們將調用服務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; 
     } 
    } 
}); 

我希望我的問題是有道理的。任何幫助將非常感激。

回答

9

這是否適合您?

.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

1

$http已經返回給你的承諾,更是在2種有用的類型:成功&錯誤。所以基本上,@ kfis提供的選項不會捕獲錯誤並且不靈活。 你可以寫一些簡單的:

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