$ Q延迟和承诺以及如何使用它们来加载数据,控制器中的视图显示前 [英] $q defer and promises and how to use them to load the data for a controller before the view is rendered
问题描述
这一直是我找到的最相关的事情: http://stackoverflow.com/a/11972028/110233
这似乎很好地工作时,我只想要回一件事,但我对如何当其他的东西依赖于第一件事就是返回多个不确定的事情。
由于这是一种钝,这里的一对目前我在做什么一个小例子:
window.EventRosterCtrl =($范围,子事件) - GT;
$ scope.subevent =子事件EventRosterCtrl.resolve =
子事件:(子事件,$路线) - GT;
递延= $ q.defer() SubEvent.get {subevent_id:$ route.current.pathParams.subevent_id},(子事件) - GT;
deferred.resolve子事件 返回deferred.promise
和这里是什么我希望做一个例子:
window.EventRosterCtrl =($范围,子事件,地址) - GT;
$ scope.subevent =子事件
$ scope.addresses =地址EventRosterCtrl.resolve =
子事件:(子事件,$路线) - GT;
递延= $ q.defer() SubEvent.get {subevent_id:$ route.current.pathParams.subevent_id},(子事件) - GT;
deferred.resolve子事件 返回deferred.promise 地址:(用户) - GT;
递延= $ q.defer() #你怎么叫子事件首先,你会如何访问这里吗?
在subevent.participants参与者
User.get {USER_ID:participant.user},(用户) - GT;
地址[participant._id] = user.address deferred.resolve地址 返回deferred.promise
好吧,所以你无法控制这样的说法,但周围的工作,想到(当一个分辨率为依赖于另一个整理第一)是只是把一切都放在一个对象,并解决这个问题。什么结束了工作最适合我做了一个服务,但按照我原来的例如:
window.EventRosterCtrl =($范围,资讯) - GT;
$ scope.subevent = info.subevent
$ scope.addresses = info.addressesEventRosterCtrl.resolve =
信息:(子事件,用户,$路径,$ Q) - GT;
递延= $ q.defer()
resolvedInfo = {} SubEvent.get {subevent_id:$ route.current.pathParams.subevent_id},(子事件) - GT;
resolvedInfo.subevent =子事件 在subevent.participants参与者
User.get {USER_ID:participant.user},(用户) - GT;
地址[participant._id] = user.address 如果addresses.length是subevent.participants.length
resolvedInfo.addresses =地址
deferred.resolve resolvedInfo 返回deferred.promise
This has been the most relevant thing I found: http://stackoverflow.com/a/11972028/110233
It seems to work fine when I only want to return one thing, but I'm unsure on how to return multiple things when the other things depend on the first thing.
Since that's kind of obtuse, here's a small example on what I'm currently doing:
window.EventRosterCtrl = ($scope, subevent) ->
$scope.subevent = subevent
EventRosterCtrl.resolve =
subevent: (SubEvent, $route) ->
deferred = $q.defer()
SubEvent.get {subevent_id: $route.current.pathParams.subevent_id}, (subevent) ->
deferred.resolve subevent
return deferred.promise
And here's an example of what I would want to do:
window.EventRosterCtrl = ($scope, subevent, addresses) ->
$scope.subevent = subevent
$scope.addresses = addresses
EventRosterCtrl.resolve =
subevent: (SubEvent, $route) ->
deferred = $q.defer()
SubEvent.get {subevent_id: $route.current.pathParams.subevent_id}, (subevent) ->
deferred.resolve subevent
return deferred.promise
addresses: (User) ->
deferred = $q.defer()
# how do you get subevent called first and how would you access it here?
for participant in subevent.participants
User.get {user_id: participant.user}, (user) ->
addresses[participant._id] = user.address
deferred.resolve addresses
return deferred.promise
Ok, so a you can't control it that way, but a work around that comes to mind (when one resolution is dependent on another finishing first) is just put everything in one object and resolve that. What ended up working best for me was making a service, but to follow my original example:
window.EventRosterCtrl = ($scope, info) ->
$scope.subevent = info.subevent
$scope.addresses = info.addresses
EventRosterCtrl.resolve =
info: (SubEvent, User, $route, $q) ->
deferred = $q.defer()
resolvedInfo = {}
SubEvent.get {subevent_id: $route.current.pathParams.subevent_id}, (subevent) ->
resolvedInfo.subevent = subevent
for participant in subevent.participants
User.get {user_id: participant.user}, (user) ->
addresses[participant._id] = user.address
if addresses.length is subevent.participants.length
resolvedInfo.addresses = addresses
deferred.resolve resolvedInfo
return deferred.promise
这篇关于$ Q延迟和承诺以及如何使用它们来加载数据,控制器中的视图显示前的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!