这篇文章讲的不错, 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!

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

  1. C3P0数据源和Tomcat jdbc数据源的基本配置

    在项目中我们经常需要使用数据源,数据源存储所有建立数据库连接的信息.就象通过指定文件名你可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接.下面分别对C3P0数据源和T ...

  2. Weblogic Xa数据源和非Xa数据源的选择

    背景: 在项目上,不管是ADF应用,BPM应用,或者是OSB.SOA接口,数据源和出站连接池的建立必然少不了,而数据源的类型就有Xa数据源和非Xa数据源,那我们如何选择呢,选择不当会造成什么后果呢,下 ...

  3. 更改所有数据透视表的数据源

    If you want to change the data source for a single Excel Pivot Table, you can use a command on the R ...

  4. 你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语

    点击关注 InfoQ,置顶公众号 接收程序员的技术早餐 网友"廖师傅廖师傅"表示,他经常通过某网站订某个特定酒店的房间,长年价格在 380 元 -400 元.偶然一次,他从前台得知 ...

  5. 【天池基础知识】直方图,Q~Q图、KDE分布图+对应的官方API文档

    目的 直方图和Q-Q图的目的:是为了看看数据是不是符合正态分布或者是不是对角线分布,这样对数据的采取的时候会更加有效一些(比如那些不太行的数据,偏离太多的数据我们删除,那些分布太高的可以用对数进行降低 ...

  6. OLEDB数据源和目标组件

    在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...

  7. 小姐姐的详细SpringBoot教程之入门 连接Mysql、Druid数据源和整合MyBatis(三)

    文章目录 1.整合JDBC使用 1.创建项目 2.打开项目 3.使用我们的Idea连接我们的mysql数据库 1. 5.最后,测试是否可以查询数据 6. 最后简单的实现增删改查 2.整合Druid数据 ...

  8. pandas使用方括号[]或者loc函数、基于列名称或者列名称列表索引dataframe中的单个数据列或者多个数据列(accessing columns of a dataframe)

    pandas使用方括号[]或者loc函数.基于列名称或者列名称列表索引dataframe中的单个数据列或者多个数据列(accessing columns of a dataframe using co ...

  9. R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图

    R语言使用ggradar包可视化基本雷达图(radar chart.蜘蛛图spider plot).可视化单个数据对象的雷达图 目录

最新文章

  1. 20162329 2017-2018-1 《程序设计与数据结构》第九周学习总结
  2. 有关scanf输入的问题
  3. 知识表示学习神器OpenKE:快速获取KG表示
  4. groovy 2.5.4_Java 7 vs Groovy 2.1性能比较
  5. visualize python_安利一个Python大数据分析神器!
  6. 聚类算法评价指标学习笔记
  7. 当知识图谱遇上预训练语言模型 -- 留言送书
  8. 用ajax获取淘宝关键字接口
  9. VS2015编译的OpenJDK8,会崩溃
  10. 海康大华网络摄像机搜索工具
  11. 统一社会信用代码验证
  12. 多线程通信Queue
  13. 开始报名丨CCF C³-13@奇安信:透视俄乌网络战 —— 网络空间基础设施面临的安全对抗与制裁博弈...
  14. 投融资项目入门和总结
  15. 围棋 android 开源,腾讯正式开源围棋AI技术PhoenixGo
  16. 小米4c android版本号,小米4c的手机系统是什么?能升级安卓5.0吗?
  17. Android之在设备之间传输--MediaRouter、Google Cast、Amazon Fling介绍
  18. Python解析wireshark所捕获的数据报
  19. 设计师值得收藏的5个设计网站
  20. 牛客国庆集训派对Day2 H 卡牌游戏 [ 期望dp ]

热门文章

  1. python教程app下载地址_python教程
  2. TCP第4次挥手为何要等待2MSL才关闭?
  3. 设计模式之单例模式学习笔记
  4. 常用服务器返回码意义
  5. matlab 图像分割 提取人像_几种典型的图像处理技术(分类 目标提取 目标跟踪 语义分割 实例分割)...
  6. chrome jssip
  7. 最重要的事情只有一件
  8. android studio 如何让包名展开
  9. javascript DOM 编程艺术----笔记
  10. 领度CEO廖睿:企业社交最大的阻力来自老板