javascript - angularjs如何在service中预处理ajax返回的data
黄舟
黄舟 2017-04-10 16:39:20
[JavaScript讨论组]

以前

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号