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