angularjs如何在service中预处理ajax返回的data

savokiss
  • 6.1k

以前

本来我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,形成预处理的效果,谢谢大家!

回复
阅读 4k
1 个回答

这好办, 你呆在 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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏