问题描述
在项目定义了两个服务,获取task和project,如果在controller中一起获取他们的数据然后进行赋值呢?目前我是通过
jstaskService.get({id:id},function(data1){ //... projectService.get({id:id},function(data2){//里面赋值的操作很长... })})
请问大神们采用$q的方式应该如何写,还有我在很多地方会用到这个获取数据的操作,如何让他们复用呢?谢谢
问题解答
回答1:根据你的要求写了一下,可以看下面的代码:
javascriptmyApp.controller('MyController', ['$q', 'taskService', 'projectService', function($q, taskService, projectService){ var deferred = $q.defer(); var promise = deferred.promise; deferred.resolve(// 获取你要处理的对象var result = yourMethod.get({id: id}); ); deferred.reject(// 获取不到是打印错误 ) promise.then(function(result){// 如果经过taskService处理的数据还需要projectService进行处理的话,返回这个结果var obj = taskService.func(result);return obj; },function(error){ // 错误处理 }).then(function(result){// 用projectService处理获取到的对象projectService.func(result); },function(error){// 错误处理 });}]);
如果想重复使用的话,可以将这个整体当做一个服务,因为不知道你具体的代码,所以也不好说.
回答2:可以在service中增加一个方法,是同时获取两个的就OK了,例如:
js// someService 中 伪代码someService.getAll = function(id) { var pmo = $q.all([taskService.get({id:id}), projectService.get({id:id})]); // 根据情况,可以写下边的代码,也可以直接返回这个pro pmo.then(....)}回答3:
taskService.sub1 = function(post_data, callback) { projectService.get(post_data, function(rsp){if(angular.isFunction(callback)) { callback(rsp);} }}taskService.sub1({ id : 1 }, function(rsp){ //里面赋值的操作很长});