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

以前

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

阅读 3.8k
评论
    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

      撰写回答

      登录后参与交流、获取后续更新提醒

      相似问题
      推荐文章