解析一个函数并使用其副作用来记录服务中的数据
我正在用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
在服务 )。
看起来,与解析数据相比,当我们有更多的数据需要记录时,我们只需要更多的私有变量,并且在服务中产生更多的副作用就更容易了。
有没有人知道我所做的是一种不好的/常见的/良好的做法? 另外,为什么codeService
中resolve: {...}
和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