在Angular上链接异步任务

时间:2014-06-16 15:04:12

标签: angularjs asynchronous promise broadcast ionic-framework

目标

我正在做的是链接各种异步任务,这些异步任务依赖于前面的响应,最终得到一个包含所有响应的对象数组,以包含$scope中使用的所有响应。我使用的是AngularMongoDB

逻辑

因此,我有多个Url与使用User模型的特定UserUrl相关联。每个Url也与使用Group模型的GroupUrl相关联。 客户端会看到Groups列表,但列表中的每个项目都会显示UserUrl和属于每个GroupUrl的{​​{1}}的数据。 < / p>

为此,我使用的是Grouppromises

首先我得到所有Broadcast Service

UserUrls

Foreach allUrlByUser( $scope.user ) .then( function(userUrls){ angular.forEach( userUrls, function(userUrl){ allUrlById(userUrl); }); }); 我解决了Userurl本身:

Url

发出的消息的观察者是:

allUrlById = function( userUrl )
  {
      return ajaxService
              .api( 'allUrlById',userUrl.url )
              .then( function( url )
              {
                var wrap = {
                  url : url[0],
                  userUrl: userUrl
                };
                /*
                Emit message passing a object response built 
                using previous and current async data.
                */
                Messenger.call(Messenger.allUrlById,
                  wrap);  
              });

回调函数是:

$scope.$on(Messenger.allUrlById, function(e,msg) {
    return allGroupUrlById(msg);
  });

问题

考虑到我需要一个混合多个异步任务数据的最终包装对象数组:

  • 这是一种正确/可接受的方式吗?
  • 你认为这种技术能够在大量的查询中充分发挥作用吗?
  • 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您不需要广播服务,承诺就足够了:

allUrlByUser( $scope.user ).then(function(userUrls){
    angular.forEach( userUrls, function(userUrl){
        allUrlById(userUrl).then(function(result) {
            allGroupUrlById(result);
        });
    });
});

allUrlById = function( userUrl ) {
    return ajaxService
          .api( 'allUrlById',userUrl.url )
          .then( function( url ) {
              return {
                  url : url[0],
                  userUrl: userUrl
              };
          });
}

allGroupUrlById = function(result) {
    return ajaxService
          .api( 'allGroupUrlById', result.url._id )
          .then( function( groupUrl ) {
              var wrap = {
                  url : result.url,
                  userUrl: result.userUrl,
                  group : groupUrl[0].group
              };
              $scope.groups.push(wrap);
          });
}