2015-04-21 14 views
3

在使用AngularJS中的IndexedDB時,我有這樣的困境,正如標題中所描述的那樣,並不確定什麼纔是正確的方式。AngularJS + IndexedDB,打開所有控制器使用的數據庫一次,或者分別打開每個請求的數據庫?

  1. 在許多教程中,數據庫正在打開一次,就是這樣,所有方法都使用這一個連接。

  2. 在一個AngularJS特定示例中,數據庫打開請求以及所有CRUD方法都包裝在工廠中,並且一旦加載控制器,就調用open方法,並且所有CRUD方法都在這一個控制器中。

  3. 我明白這是一個很好的做法,保持控制器苗條,使他們更可重用。所以,我對每一個CRUD方法單獨的控制器,這意味着我需要打開數據庫的每個請求,像這樣一個單獨的呼叫:

    websiteService.openDatabase().then(function() { 
        websiteService.addWebsite($scope.website.url, $scope.website.color).then(function() { 
    
        }, function(err) { 
         console.log(err); 
        });  
    }); 
    

所以,每次我想addWebsite,我首先openDatabase並等待承諾解決。

websiteService是一個工廠,與IndexedDB的工作的所有方法都

什麼是最好的做法嗎?如果還有其他方法,請在此提及,請提及。

如果有幫助,下面是完整的控制器代碼:

app.controller('AddWebsiteCtrl', ['$scope', '$location', '$routeParams', 'websiteService', function($scope, $location, $routeParams, websiteService) { 
    $scope.save = function() { 
     websiteService.openDatabase().then(function() { 
      websiteService.addWebsite($scope.website.url, $scope.website.color).then(function() { 

      }, function(err) { 
       console.log(err); 
      });  
     });  
     $location.path('/overview'); 
    }; 

    $scope.cancel = function() { 
     $location.path('/overview'); 
    }; 
}]); 

回答

5

這個問題是不幸的是有爭議的。我個人建議每次打開數據庫。其他人會不同意(並且有很多)。

如果您可以保證您的數據庫請求將始終發生在之後建立連接,則可以使用單個連接。如果您不確定indexedDB如何在各種瀏覽器中工作,或者無法保證連接已建立,或者無法保證連接仍處於打開狀態,請爲每個單獨的任務打開一個連接。

如果你知道異步代碼是如何工作的,你可能可以做任何你認爲最好的事情,因爲這兩種方法在技術上都是錯誤的。

+0

感謝您的回覆。我是異步代碼的新手,所以也許這太天真了,但我認爲如果事情是異步的,我們不能確定連接總是打開的。而且,只用一個連接就可以產生不一致的結果,而每次打開連接都很簡單。所以我唯一的擔心是 - 你認爲每次額外的請求會顯着影響性能嗎?或者那些不同意的人的主要反對論點是什麼? – CodeVirtuoso

+0

對於任何感興趣的人,我想通過將調用OpenDatabase移動到websiteService(這是一個工廠)的AddWebsite方法中,我找到了一種方法使我的示例中的代碼更加乾爽。 – CodeVirtuoso

+2

我每次都打開一個連接。根據我的經驗,它不會顯着影響性能。 – Josh