Coffeescript $q延迟和承诺,以及如何在呈现视图之前使用它们加载控制器的数据
这是我发现的最相关的事情: 当我只想返回一件东西时,它似乎工作得很好,但当其他东西依赖于第一件东西时,我不确定如何返回多件东西 因为这有点迟钝,下面是一个关于我目前所做工作的小例子:Coffeescript $q延迟和承诺,以及如何在呈现视图之前使用它们加载控制器的数据,coffeescript,angularjs,promise,Coffeescript,Angularjs,Promise,这是我发现的最相关的事情: 当我只想返回一件东西时,它似乎工作得很好,但当其他东西依赖于第一件东西时,我不确定如何返回多件东西 因为这有点迟钝,下面是一个关于我目前所做工作的小例子: window.EventRosterCtrl = ($scope, subevent) -> $scope.subevent = subevent EventRosterCtrl.resolve = subevent: (SubEvent, $route) -> de
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
下面是我想做的一个例子:
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
您需要使用.then()链接期票 var promise=firstOperation(); promise=promise.then(函数(值){ //多做些工作 返回值;//可以是另一个承诺 }); 回报承诺;//解决这两个步骤后,将解决此问题
EventRosterCtrl仅在子事件准备就绪时初始化,因此以下操作应有效:
window.EventRosterCtrl = ($scope, subevent) ->
$scope.subevent = subevent
for participant in subevent.participants
User.get {user_id: participant.user}, (user) ->
$scope.addresses[participant._id] = user.address
EventRosterCtrl.resolve =
subevent: (SubEvent, $route) ->
deferred = $q.defer()
SubEvent.get {subevent_id: $route.current.pathParams.subevent_id}, (subevent) ->
deferred.resolve subevent
return deferred.promise
好的,所以你不能这样控制它,但是想到一个解决方法(当一个解决方案依赖于另一个先完成时)就是把所有的东西放在一个对象中并解决它。最适合我的是提供服务,但遵循我最初的示例:
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
@Justen,我不知道Coffescript,但是示例的最后一行可能类似于
返回延迟的.promise.then(函数(值){return value;})
,即promise.then()
返回一个新的承诺。这行不通。解析是一个将键映射到函数的对象,在另一个键映射中将无法访问延迟的in子事件此项仍将闪烁,因为$scope.addresses
在控制器和页面呈现后解析。
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