AngularJS $q 和 $q.all 单个数据源和多个数据源合并(promise的说明)

这篇文章讲的不错, angular $q  和 promise!!

--------------------------------------------------------------

通过调用  $q.defer() 可以构建一个新的 deffered 实例。
deffered 对象用来将 Promise 实例与 标记任务状态(执行成功还是不成功)的 API 相关联。

deffered 对象的方法

  • resolve(value) ——传入 value 解决派生的 promise。 如果 value 是一个通过 $q.reject 构造的拒绝对象(rejection) , 该promise 将被拒绝。
  • reject(reason) ——拒绝派生的promise,并提供原因 。 这相当于通过 $q.reject构造的拒绝对象(rejection)作为参数传递给 resolve。
  • notify(value)  ——在 promise 执行的过程中提供状态更新。 这在 promise 被解决或拒绝之前可能会被多次调用。

deffered 对象的属性

promise – {Promise} —— 与延迟(deferred)相关联的 promise 对象。

承诺 接口 | Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过  deferred.promise 得到该引用。
promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

promise 对象的方法

  • then(successCallback, errorCallback, notifyCallback) ——不管 promise 是被处理还是被拒绝, 一旦结果可用,then 就会尽快地异步调用 成功/错误 回调函数 只要结果是可用的。 调用回调函数时传递单个参数: 结果 或拒绝的理由。 此外,notify 回调可能被调用 0到多次,以提供 提供一个进度指示,之前承诺解决或拒绝。

这个方法 返回一个新的promise 对象, 根据 successCallback , errorCallback的返回值进行解决或拒绝 。 它还通过 notifyCallback 方法的返回值进行通知。 promise 不能从notifyCallback方法得到解决或拒绝 。

  • catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式
  • finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息

因为在 ES3版本的JavaScript中 finally 是一个保留字关键字,不能作为属性名,为了适配 IE8,您需要使用  promise[‘finally‘](callback) 这种形式来调用该方法。

研究了一下$q回调服务,看来半天都是似懂非懂的样子,感觉实现了异步加载的功能,还是动手试验并记录下来,如果不对欢迎指正(后台是ASP.Net Web API模拟的)

第一种情况的回调,对单个数据源的请求

myApp.factory(‘myService‘, function ($http, $q) {              return {                  getAllData: function () {                      //定义一个回调服务                      var deferred = $q.defer();                      $http.get(‘/API/Values‘)//此时获取的是单个数据源                          .success(function (result) {                              //将结果委托回调函数                              deferred.resolve(result);                          })                          .error(function (result) {                              debugger;                          });                      //返回回调函数结果                      return deferred.promise;                  }              };          });    function FetchCtrl($scope, $http, $templateCache, myService, myServiceAll) {                            $scope.fetch = function () {                                   var result = myService.getAllData();                  //通过回调函数结果得到数据值                  result.then(function (data) {                      $scope.result = data;              };            }  }

第二种情况的回调,对多个数据源的请求,最后同时将多个结果集合并一起返回

//服务声明          myApp.factory(‘myServiceAll‘, function ($http, $q) {              return {                  getAllData: function () {                      //定义一个回调服务                      var deferred = $q.defer();                      //定义两个获取的源路径                      var p1 = $http.get(‘/API/Values‘);                      var p2 = $http.get(‘/API/Values/0‘);                      $q.all([p1, p2])                      .then(function (results) {                          var aggregatedData = [];                          angular.forEach(results, function (result) {                              aggregatedData = aggregatedData.concat(result.data);                          });                          //将结果委托回调函数                          deferred.resolve(aggregatedData);                      });                      //返回回调函数结果                      return deferred.promise;                  }              }          });      function FetchCtrl($scope, $http, $templateCache, myService, myServiceAll) {                            $scope.fetch = function () {              //通过回调函数结果得到数据值                  var result = myServiceAll.getAllData();                  result.then(function (data) {                        $scope.result = data;                  })              };            }  

方法简介

$q service 四个方法函数 , 按照个人理解划分为三类。

  1. 非链式调用

    $q.when(value)

    传递变量值,promise.then()执行成功回调

    $q.all(promises)

    多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象。

  2. 错误信息传递

    $q.reject(reason)

    返回一个失败原因,promise.then()执行失败回调

  3. 链式调用

    $q.defer()

    返回一个deferred对象

  • resolve(value) – 简化说明 配置该deferred对象promise的成功调用函数参数
  • reject(reason) – 简化说明 配置该deferred对象promise的失败调用函数参数
  • promise - 简化说明 配置后的promise对象

个人理解说明

链式调用内部的默认失败回调会向后传递异常,所以为避免麻烦,且不在意每一处的业务逻辑错误,不要在每一处then()处声明异常处理函数,在最后一个 then()中声明即可。

      promiseX.then(function(){}).then(function(){})      .then(function(val){},function(reason){})

如果在意每一处可能出现的业务逻辑错误,在回调中return $q.reject();传递错误.无论执行哪一个回调函数,如果内部没有人为return $q.reject();,则若没有执行错误,暨返回成功信号。

var deferred = $q.defer();    deferred.resolve(1);var promiseA = deferred.promise;promiseA   .then(function(val){$log.info(val);return ++val;})   .then(function(val){$log.info(val);return ++val;})   .then(         function(val){$log.info(val);return ++val;},         function(val){$log.info(val)}   );

链式调用完成后控制台打印出 1,2,3

var deferred = $q.defer();    deferred.resolve(1);var promiseA = deferred.promise;promiseA   .then(function(val){$log.info(val);return $q.reject(15);})   .then(function(val){$log.info(val);return ++val;})   .then(function(val){$log.info(val);return ++val;})   .then(function(val){$log.info(val);return ++val;})   .then(         function(val){$log.info(val);return ++val;},         function(val){$log.info(val)}   );

链式调用完成后控制台打印出 1,15,可以看出,第一个return $q.reject(15)之后,直到最后一个then()才有错误回调函数,所以异常一直传递到最后,中间的几个then()没有错误回调函数。

 $q.when(‘I Love you!‘)    .then(function(value){$log.info(value)}); 

控制台打印出I Love you!;

 $q.when($q.reject(‘I Hate you!‘))    .then(null,function(value){$log.info(value)}); 

控制台打印出I Hate you!;

 var promiseA = $q.when(‘I Love you!‘); var promiseB = $q.when(‘Love story!‘); var promiseC = $q.when("Let‘t get wet!"); $q.all([promiseA,promiseB,promiseC]).then(function(value){    value[0].then(function(value){$log.info(value);})    value[1].then(function(value){$log.info(value);})    value[2].then(function(value){$log.info(value);}) }) 

控制台打印出I Love you!,Love story!,"Let‘t get wet!

时间: 2024-11-05 15:56:24

AngularJS $q 和 $q.all 单个数据源和多个数据源合并(promise的说明)的相关文章

Xa数据源和非Xa数据源的选择

Weblogic Xa数据源和非Xa数据源的选择 在项目上,不管是ADF应用,BPM应用,或者是OSB.SOA接口,数据源和出站连接池的建立必然少不了,而数据源的类型就有Xa数据源和非Xa数据源,那我们如何选择呢,选择不当会造成什么后果呢,下面给出一点小小的心得 如何选择: 在新建数据源的时候,经常面临是建立Xa数据源还是非Xa数据源,这块有一个选择标准,如果数据库后台package的函数或者过程 需要commit或者rollback,那么调用这个package的数据源就必须是非Xa的. 换言之

JDBC数据源和连接池

数据库连接池就是在应用程序启动时就创建足够多的数据库连接池,在java程序中需要访问 数据库时就可以通过数据源取得一个空闲连接,用完在返还到连接池中 实例: 在Tomcat6.0中+MySQL5.5数据源和连接池的配置 (1)将数据库的JDBC驱动程序复制到<CATALINA_HOME>/common/lib目录下 (2)在<CATALINA_HOME>/conf/server.xml中配置数据源和连接池,例如 <Context path="/JSP_JDBC&qu

JDBC五数据源和数据池(web基础学习笔记十一)

一.为什么使用数据源和连接池 现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接.因此针对这种情况,提出了数据源和连接池的概念.使用数据源和连接池可以达到复用数据库连接的目的. 二.数据源和连接池概念 其实,数据源和连接池是两个不同的概念.有些人会把它们弄混.数据源是用来连接数据库,获得Connection 对象的,在Java 中使用javax.sql.DataSource接口来

数据源和连接池

数据源 从接触DBMS开始就在用数据源(DataSource),它其中很重要的一个作用就是可以管理Connection,管理的方式也就是经常听到的ConnectionPool.它的管理其实就是对DriverManager获取Connection进行了包装. 下面就首先看看用DataSource来取代DriverManager来获取Connection的好处: 一般DataSource内部会用一个连接池来缓存Connection,这样获得Connection速度很快,可以大幅度提高数据库的访问速度

Oracle单个数据文件超过32G后扩容

Oracle单个数据文件超过32G后扩容 表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定.DB_BLOCK_SIZE参数可以设置为4K.8K.16K.32K.64K等几种,Oracle的物理文件最大只允许4194304个数据块(这个参数具体由操作系统决定,一般应该是此数字),表空间数据文件的最大值对应关系就可以通过4194304×DB_BLOCK_SIZE/1024M计算得出. 4k最大表空间为:16384M 8K最大表空间为:32768M

Tomcat中配置数据源和连接池

(1)为什么需要配置数据源和连接池? 我们知道在每次java程序俩接数据库的时候我们都需要请求连接数据库然后打开读取数据然后关闭, 这样使得每一个用户访问的时候都需要服务器做出相应,这样的话服务器端承受巨大的压力,如此效率就会下降, 为了解决这个问题我们可以让数据库提前打开连接等待用户连接当有用户连接的时候,就把数据库已存在的连接 给用户即可 而我们就把这条连接叫做"连接池"  当连接池中的连接足够的话 就分给用户,如果不够用户则在"|队列池"中等待: (2)实现过

数据源和连接池介绍

为什么使用数据源和连接池 我们现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接.因此针对这种情况,提出了数据源和连接池的概念.使用数据源和连接池可以达到复用数据库连接的目的. 数据源和连接池概念 其实,数据源和连接池是两个不同的概念.有些人会把它们弄混. 数据源是用来连接数据库 获得Connection对象的,在Java中使用javax.sql.DataSource接口来表示.

KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)

http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果.纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback的方式提供给 KCP.连时钟都需要外部传递进来,内部不会有任何一次系统调用. 整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中.也许

angular中 通过$q 异步方式 获取服务数据

//服务中 获取check列表 services.factory('checkservice', ['$http','$q',     function($http,$q) {       return {          checks : function(groupName){          var deferred1 = $q.defer()          $http.get("/checksJsonByGroup2?groupName="+groupName)