在 Angular 上链接异步任务
Posted
技术标签:
【中文标题】在 Angular 上链接异步任务【英文标题】:Chaining async tasks on Angular 【发布时间】:2014-08-06 10:56:43 【问题描述】:目标
我正在做的是链接各种异步任务,这些任务依赖于先前任务的响应,以最终获得一个对象数组,这些对象包含要在$scope
中使用的所有响应。我正在使用Angular
和MongoDB
。
逻辑
所以,我有多个 Url
使用 UserUrl
模型关联到特定的 User
。每个Url
也使用GroupUrl
模型与Group
相关联。 客户端将看到Groups
的列表,但列表中的每个项目都显示UserUrl
的数据以及属于每个Group
的GroupUrl
。
为此,我使用promises
和Broadcast Service
。
首先我得到所有UserUrls
:
allUrlByUser( $scope.user )
.then( function(userUrls)
angular.forEach( userUrls, function(userUrl)
allUrlById(userUrl);
);
);
Foreach Userurl
我自己解决了Url
:
allUrlById = function( userUrl )
return ajaxService
.api( 'allUrlById',userUrl.url )
.then( function( url )
var wrap =
url : url[0],
userUrl: userUrl
;
/*
Emit message passing a object response built
using previous and current async data.
*/
Messenger.call(Messenger.allUrlById,
wrap);
);
发出消息的观察者是:
$scope.$on(Messenger.allUrlById, function(e,msg)
return allGroupUrlById(msg);
);
而回调函数是:
allGroupUrlById = function( msg )
return ajaxService
.api( 'allGroupUrlById', msg.response.url._id )
.then( function( groupUrl )
var wrap =
url : msg.response.url,
userUrl: msg.response.userUrl,
group : groupUrl[0].group
;
$scope.groups.push(wrap);
);
问题
考虑到我需要一个最终的包装对象数组,混合多个异步任务的数据:
这是一种适当/可接受的方式吗? 您认为这种技术是否足以处理大量查询? 有什么建议吗?【问题讨论】:
但 $q.all 不是假设我们事先拥有所有必需的选项值吗?我的意思是,我有 3 个异步任务,第二个需要第一个的结果,第三个需要第二个.. $q.all 在这种情况下仍然可以使用吗? 是的,虽然不是必需的。 【参考方案1】:你不需要广播服务,承诺就足够了:
allUrlByUser( $scope.user ).then(function(userUrls)
angular.forEach( userUrls, function(userUrl)
allUrlById(userUrl).then(function(result)
allGroupUrlById(result);
);
);
);
allUrlById = function( userUrl )
return ajaxService
.api( 'allUrlById',userUrl.url )
.then( function( url )
return
url : url[0],
userUrl: userUrl
;
);
allGroupUrlById = function(result)
return ajaxService
.api( 'allGroupUrlById', result.url._id )
.then( function( groupUrl )
var wrap =
url : result.url,
userUrl: result.userUrl,
group : groupUrl[0].group
;
$scope.groups.push(wrap);
);
【讨论】:
这是一个一个的操作,这是OP想要的吗?以上是关于在 Angular 上链接异步任务的主要内容,如果未能解决你的问题,请参考以下文章
node.js接收异步任务结果的两种方法----callback和事件广播