以前
本来我service中带代码是这样的:
var url = 'xxx';
return $http(url,params);
然后controller这样处理就行了:
xxxService.get().success(function(data){
$scope.list = data.list;
});
现在
然后现在后端给的数据不好,想要在service中提前处理数据然后controller拿到的直接就是处理好的数据
var url = 'xxx';
return $http(url,params).success(function(data){
data.addAttr = '添加的属性';
});
然后controller中
xxxService.get().success(function(data){
$scope.list = data.list;
console.log(data.addAttr);
});
问题
现在的处理方式好像没什么问题,数据都会先走service的success然后再走controller的success,我就以为他是同步处理的了,但是我在service中的success添加了几个循环就导致这几个循环没有执行完,我这种写法有问题吗?
假如我想要在service中处理data,然后在controller中在处理处理过的data,是不是要用promise chain?一般怎么用呢?
解决
我现在的写法没问题,问题出在其他地方出错导致代码中断。$http本身就是返回的封装过的promise,所以上面假如我在service先处理数据,angular就会自动构造promise chain,形成预处理的效果,谢谢大家!
这好办, 你呆在 controller 里, 别动, 叫 service 去拿个苹果, 然后, 你叫 service 去给你削好, 然后, 你就有一个削好的苹果了; 不要直接给 service 说: 拿个苹果削了给我, 举粟:
FruitService
exports.peeled_fruit = null;
exports.peelFruit = function(fruit) {
return exports.peeled_fruit = peel(fruit);
};
exports.getFruit = function(kind, count) {
return $http.get('/fruits/' + kind + '/' + 1);
}
return exports;
FruitController
var vm = this;
vm.fruitService = FruitService;
vm.fruitService.getFruit('apple', 1).success(vm.fruitService.peelFruit).finally(vm.eat);
vm.eat = function(fruit) {
louzhu.mouth.bite(fruit);
}
把 success 与 finally 都换成 then 也可以试一下, 也可以给 then 里传入第二个 出错时调用的函数,
参考:
https://docs.angularjs.org/api/ng/service/$http
http://www.peterbe.com/plog/promises-with-$http
不知道你不是要这个效果 ,,,, 还有啥可以来前端群里聊: 343243212