AngularJS + IndexedDB,为所有控制器打开一次数据库,或者为每个请求单独打开它?

Cod*_*oso 3 javascript indexeddb angularjs

在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);
        });     
    }); 
    
    Run Code Online (Sandbox Code Playgroud)

所以,每次我想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');
    };  
}]);
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 5

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

如果您可以保证建立连接始终会发生数据库请求,则可以使用单个连接.如果您不确定indexedDB如何在各种浏览器中工作,或者不能保证连接已经建立,或者无法保证连接仍然是打开的,那么为每个单独的任务打开一个连接.

如果您知道异步代码的工作原理,那么您可能很好地做任何您认为最好的方法,因为这两种方法在技术上都是错误的.

  • 我每次都打开一个连接.根据我的经验,它不会显着影响性能. (2认同)