【问题标题】:Chaining async tasks on Angular在 Angular 上链接异步任务
【发布时间】:2026-02-24 21:40:02
【问题描述】:

目标

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

逻辑

所以,我有多个 Url 使用 UserUrl 模型关联到特定的 User。每个Url 也使用GroupUrl 模型与Group 相关联。 客户端将看到Groups 的列表,但列表中的每个项目都显示UserUrl 的数据以及属于每个GroupGroupUrl

为此,我使用promisesBroadcast Service

首先我得到所有UserUrls:

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

Foreach 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);
  });

而回调函数是:

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

问题

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

  • 这是一种适当/可接受的方式吗?
  • 您认为这种技术是否足以处理大量查询?
  • 有什么建议吗?

【问题讨论】:

  • 但 $q.all 不是假设我们事先拥有所有必需的选项值吗?我的意思是,我有 3 个异步任务,第二个需要第一个的结果,第三个需要第二个.. $q.all 在这种情况下仍然可以使用吗?
  • 是的,虽然不是必需的。

标签: angularjs asynchronous promise broadcast ionic-framework


【解决方案1】:

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

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);
          });
}

【讨论】:

  • 这是一个一个的操作,这是OP想要的吗?
最近更新 更多