2015-08-26 144 views
0

在我的控制器中,我使用工廠的方法來更新一些數據。例如,我試圖獲取更新的用戶數組。我應該從工廠退回承諾嗎?或者我應該從承諾中返回數據(不確定我是否正確表述了這一點)?AngularJS - 您是否從服務/工廠返回承諾或數據?

我問,因爲我看到這兩種方式,有人說控制器不應該處理請求是否成功或失敗。在這種情況下,我特別談論$ http返回的諾言。

或者換句話說,我應該在工廠內使用then()方法,還是應該在工廠返回後在控制器中使用它?

我試着從服務中處理成功和錯誤回調(使用this()方法),但是當我將數據返回給控制器時,用戶數組未正確更新。我假設這是因爲請求是異步的。因此,在控制器,它會是這個樣子:

vm.users = userFactory.getUsers(); 

如果我從控制器內處理的承諾,當時()方法中設置的用戶陣列,它工作正常。但是這可以回到我應該用到的地方():

userFactory.getUsers().then(
    function(data){ 
     vm.users = data; 
    }, ... 

希望有人能夠對此有所瞭解或提供一些意見。謝謝!

回答

0

我沒有問題,控制器根據響應失敗/成功決定做什麼。事實上,它可以讓你輕鬆地處理不同的情況,並且不會給控制器增加很多開銷(控制器應該儘可能小,專注於當前的任務,但是對於我來說,不管請求失敗是不是其任務的一部分)。

無論如何,在Angular HTTP請求被包裝在承諾內部(我記得在以前的版本有一種方法來自動打開它們),所以從服務/工廠返回總是返回一個承諾,必須解決。

我更願意從服務/工廠返回承諾,因爲我傾向於讓其他類決定如何處理響應。

1

有沒有辦法可以從工廠返回的數據(因爲它是一個異步調用),而無需使用一個callback方法(推薦):

userFactory.prototype.getUsers = function(callback){ 
    $http.get('users').then(function (response) { 
     callback(response.data); 
    }); 
}; 

或者承諾的方式。

如果您擔心處理控制器上的錯誤,請不要擔心!您可以在服務處理錯誤:

userFactory.prototype.getUsers = function(){ 
    return $http.get('users').then(function(response) { 
     return response.data; 
    }, function(error) { 
    // Handle your error here 
    return []; 
    }); 
}; 

可以returnthen的結果,它會被鏈接。所以從service將執行和then,稍後,控制器。

+0

甚至更​​好的方法 - 您可以通過在響應中使用攔截器並將所有邏輯保存在一個地方來處理錯誤;) – Kamo