2

これは私が見つけた最も関連性の高いものです: https://stackoverflow.com/a/11972028/110233

1つだけ返したいときはうまくいくようですが、他のものが最初のものに依存しているときに複数のものを返す方法がわかりません。

それはちょっと鈍いので、私が現在行っていることの小さな例を次に示します。

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
4

3 に答える 3

4

.then() を使用してプロミスをチェーンする必要があります

  var promise = firstOperation();
  promise = promise.then(関数(値) {
    // もう少し作業を行う
    戻り値; // 別の約束になる可能性があります
  });
  約束を返す; // これは、両方のステップが解決されたときに解決されます
于 2012-09-07T05:47:50.183 に答える
2

わかりましたので、そのように制御することはできませんが、頭に浮かぶ回避策 (ある解像度が別の仕上げに依存している場合) は、すべてを 1 つのオブジェクトに入れて解決することです。私にとって最もうまくいったのはサービスを作ることでしたが、私の元の例に従うと:

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
于 2012-11-15T23:38:00.737 に答える
-1

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
于 2012-09-10T18:35:09.860 に答える