AngularJS + IndexedDB,打开一次数据库供所有控制器使用,还是为每个请求单独打开?

AngularJS + IndexedDB, open database once for all controllers to use, or open it for each request separately?

在 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 并等待 promise 解决。

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');
    };  
}]);

不幸的是,这个问题是有争议的。我个人建议每次都打开数据库。其他人会不同意(并且有很多)。

如果你能保证你的数据库请求总是建立连接后发生,那么使用单个连接就可以了。如果您不确定 indexedDB 在各种浏览器中的工作方式,或者不能保证连接已经建立,或者不能保证连接仍然打开,那么为每个单独的任务打开一个连接。

如果您知道异步代码的一般工作原理,您可能会做任何您认为最好的事情,因为这两种方法在技术上都没有错。