在 Angular 上链接异步任务

Posted

技术标签:

【中文标题】在 Angular 上链接异步任务【英文标题】:Chaining async tasks on Angular 【发布时间】:2014-08-06 10:56:43 【问题描述】:

目标

我正在做的是链接各种异步任务,这些任务依赖于先前任务的响应,以最终获得一个对象数组,这些对象包含要在$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 在这种情况下仍然可以使用吗? 是的,虽然不是必需的。 【参考方案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想要的吗?

以上是关于在 Angular 上链接异步任务的主要内容,如果未能解决你的问题,请参考以下文章

量角器:失败:超时等待异步角度任务在11秒后完成

JavaScript异步机制

node.js接收异步任务结果的两种方法----callback和事件广播

在双工 WCF 服务的客户端中使用基于任务的异步模式时出错

如何知道以编程方式在我当前的应用程序中运行了多少异步任务/服务?

Angular 4图像异步与承载标头