$q defer 和 promises 以及如何使用它们在视图呈现之前为控制器加载数据 [英] $q defer and promises and how to use them to load the data for a controller before the view is rendered

查看:16
本文介绍了$q defer 和 promises 以及如何使用它们在视图呈现之前为控制器加载数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我发现的最相关的内容:https://stackoverflow.com/a/11972028/110233

This has been the most relevant thing I found: https://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 defer 和 promises 以及如何使用它们在视图呈现之前为控制器加载数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆