$ Q延迟和承诺以及如何使用它们来加载数据,控制器中的视图显示前 [英] $q defer and promises and how to use them to load the data for a controller before the view is rendered

查看:107
本文介绍了$ Q延迟和承诺以及如何使用它们来加载数据,控制器中的视图显示前的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这一直是我找到的最相关的事情: 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屋!

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