2016-11-03 39 views
0

我正在使用MEAN堆棧。在前端承諾中連接彼此依賴的服務器調用是不好的做法嗎?

舉例來說,在我的角度代碼,我可能有:

Brand.create({name: 'name'}).then(function(brand){ 

    //here, the product's referenced brand._id depends on the Brand response 

    Product.create({'name':'name', 'category': 'food', 
     'brand': brand.data._id}).then(function(res){ 
     $scope.product = res.data; 
    }); 
}); 

它會更好做這在服務器端 - 如果有人刷新或失去第二承諾之前連接調用,它似乎可能會導致只有一個品牌被創造 - 沒有相關的產品。

如果是這樣,將兩個不同的集合連接到其各自的控制器之一是否是最佳做法?

回答

2

它會更好做這在服務器端 - 如果有人 刷新或失去援引第二承諾之前的連接,現在看來,這 可能導致只創建一個品牌 - 無相關產品 。

是的。由於以下原因,最好在服務器端完成:

  1. 通過網絡的Ajax調用更少。因此,創建一個實現更高級別操作的單個ajax調用將會更加高效。
  2. 邏輯和錯誤處理越接近數據源(例如數據庫),越容易編寫和執行可靠的事情。
  3. 您在事情中間丟失網絡連接的情況是從客戶端實施多步驟數據操作時出現的問題的完美示例。

而且。無論您在哪裏編寫代碼,都需要進行適當的錯誤處理,無論是通過數據庫中的某種事務處理系統,還是通過手動錯誤處理來解決先前的操作,當以後的操作失敗時,您總是會得到有效的系統,即使中間或後面的步驟失敗。在上面的客戶端驅動場景中,您需要Produce.create()上的.catch()處理程序,因此如果失敗,您可以從以前撤銷Band.create(),以便在出現下游錯誤時使系統保持適當狀態。請注意,如果您從客戶端管理多個步驟,這在面對客戶端連接問題時幾乎是不可能的,但是當從服務器完成時,您可能會遇到連接問題的可能性大大降低。

+0

謝謝。這與我的假設很接近。你的詳細答案正是我所尋找的。 – NoobSter

相關問題