解析一个函数并使用其副作用来记录服务中的数据

我正在用ui-router制作一个网页。 在我们进入控制器之前,我想要完成一些操作:1)在服务器中创建一个临时文件夹并写入一些文件; 2)记录文件夹的名称和其他一些数据。 自然,我选择使用resolve

.state('panels', {
    controller: 'PanelsCtrl',
    resolve: {
        init: ['codeService', function (codeService) {
            return codeService.init()
        }]
    },
    ...
});

app.service('codeService', ['$http', function ($http) {
    var srcP = "default" // private variable
    this.getSrcP = function () { return srcP };

    this.init = function () {
        return $http.post("/writeFiles", ...) // write files in a temporary folder of the server
            .then(function (res) {
                srcP = res.data;
                return srcP
            }
    }
};

app.controller('PanelsCtrl', ['$scope', 'codeService', 'init', function($scope, codeService, init) {
    $scope.src = codeService.getSrcP();
    ...
}

上面的代码有效。 然而,我感到奇怪的是1)我解决了一个异步函数(即init )而不是数据(人们通常会解析); 2)I使用的副作用init来记录数据(即, srcP 在服务 )。

看起来,与解析数据相比,当我们有更多的数据需要记录时,我们只需要更多的私有变量,并且在服务中产生更多的副作用就更容易了。

有没有人知道我所做的是一种不好的/常见的/良好的做法? 另外,为什么codeServiceresolve: {...}codeService注入到PanelsCtrl共享相同的私有变量?


我认为这是一个更好的方法,如果你清理服务,并不解决它的承诺。
您可以让UI-ROUTER解决承诺并将结果数据注入控制器中。

.state('panels', {
    controller: 'PanelsCtrl',
    resolve: {
        init: ['codeService', function (codeService) {
            return codeService.init()
        }]
    }
});

app.service('codeService', ['$http', function ($http) {
    this.init = function () {
        return $http.post("/writeFiles");
    }
};

app.controller('PanelsCtrl', ['$scope', 'init', function($scope, init) {
    $scope.src = init; //init is the resolved data of codeService...
}

我刚刚举了一个例子。 检查这个jsFiddle。


我认为从理论上讲,解决副作用是没有问题的,这就是它的目的。 以Restangular为例。 你一直在呼吁解决资源问题,缓存由Restangular处理,这基本上是一种副作用。

但是,我发现服务器端方法存在一些问题。 将文件存储在服务器上通常是一个坏主意(考虑缩放/受损的基础架构不变性)。 所以我宁愿使用这个数据库,你可以把你的文件夹抽象化为一个数据库资源。

链接地址: http://www.djcxy.com/p/77997.html

上一篇: Resolve a function and use its side effect to record data in a service

下一篇: Why are Angular.js Services created with 'new'?