编程语言
首页 > 编程语言> > javascript – 重用没有循环依赖的服务

javascript – 重用没有循环依赖的服务

作者:互联网

我有一个服务全局存储我的应用程序中使用的所有数据.

GlobalDataService(GDS)

angular
        .module('app.core')
        .service('GlobalDataService', GlobalDataService);
    GlobalDataService.$inject = ['$http', 'LineStatusService'];
    function GlobalDataService($http, LineStatusService) {
        var gds = this;

        gds.data = {
            //all my data
        }

        gds.data.lines = LineStatusService.getLineStatus().then...
    }

还有一个简单的crud服务来处理我的数据状态.

StatusDataService(SDS)

angular
        .module('app.core')
        .service('LineStatusService', LineStatusService);
    LineStatusService.$inject = ['$http', 'GlobalDataService'];
    function LineStatusService($http, GlobalDataService) {
        var service = {
            getLineStatus: getLineStatus,
            saveLineStatus: saveLineStatus,
            ...
        };

        function saveLineStatus (line, status, user) {
            var data = {
                status: {
                    status_id: status.status_id,
                    status_desc: status.status_desc
                },
                updated_by: user
            }

            return $http.post('/api/euauto/v1/delivery-status/linestatus', data)
            .then(function successCallback(response) {
                GlobalDataService.data[id].status = status;
                return response.data;
            }).catch(function errorCallback(response) {

            });
        }

        return service;
    }

GDS必须在应用程序首次加载时请求所有状态,然后状态服务处理任何其他数据请求.

现在我明白你不能有循环依赖,因此我的计划是让我的Controller使用SDS处理保存和更新,并且还更新GDS.

潜在解决方案

angular
        .module('core')
        .controller('MyController', MyController);

    MyController.$inject = ['GlobalDataService', 'LineStatusService'];
    function MyController(GlobalDataService, LineStatusService) {
        function changeStatus(line, status, user) {
            //do a thing
            //and another
            LineStatusService.saveLineStatus(line, status, user);
            GlobalDataService.data.line[id] = status;
            GlobalDataService.updateAllOtherData();
            //etc...
        }
    }

问题

我的问题是,现在我想开发一个新的Controller,其中包含完全相同的功能,我现在必须记住从我原来的Controller复制相同的代码和业务逻辑,以重用两个服务.
此外,如果GDS不依赖于SDS,它将无法加载getLineStatus(),并且应用程序中的每个Controller都必须记住加载时的getLineStatus().

理想情况下,所有逻辑和请求都应包含在一个地方,最好是我的SDS.我的GDS数据应该在整个应用程序中保持一致.

解决方法:

如果应用程序启动时应该使用数据初始化GlobalDataService,那么可以在.run()块而不是服务构造函数中初始化它.这样,GDS根本不需要注入其他服务.然后,其他数据服务可以注入GDS而不会出现循环依赖性问题.

angular
    .module('app.core')
    .run(function(GlobalDataService, LineStatusService) {

    GlobalDataService.data.lines = LineStatusService.getLineStatus().then...

});

标签:javascript,angularjs,dependency-injection,angular-services
来源: https://codeday.me/bug/20190522/1153729.html