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 四个方法函数 , 按照个人理解划分为三类。
非链式调用
$q.when(value)
传递变量值,promise.then()执行成功回调
$q.all(promises)
多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象。
错误信息传递
$q.reject(reason)
返回一个失败原因,promise.then()执行失败回调
链式调用
$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的说明)相关推荐
- C3P0数据源和Tomcat jdbc数据源的基本配置
在项目中我们经常需要使用数据源,数据源存储所有建立数据库连接的信息.就象通过指定文件名你可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接.下面分别对C3P0数据源和T ...
- Weblogic Xa数据源和非Xa数据源的选择
背景: 在项目上,不管是ADF应用,BPM应用,或者是OSB.SOA接口,数据源和出站连接池的建立必然少不了,而数据源的类型就有Xa数据源和非Xa数据源,那我们如何选择呢,选择不当会造成什么后果呢,下 ...
- 更改所有数据透视表的数据源
If you want to change the data source for a single Excel Pivot Table, you can use a command on the R ...
- 你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语
点击关注 InfoQ,置顶公众号 接收程序员的技术早餐 网友"廖师傅廖师傅"表示,他经常通过某网站订某个特定酒店的房间,长年价格在 380 元 -400 元.偶然一次,他从前台得知 ...
- 【天池基础知识】直方图,Q~Q图、KDE分布图+对应的官方API文档
目的 直方图和Q-Q图的目的:是为了看看数据是不是符合正态分布或者是不是对角线分布,这样对数据的采取的时候会更加有效一些(比如那些不太行的数据,偏离太多的数据我们删除,那些分布太高的可以用对数进行降低 ...
- OLEDB数据源和目标组件
在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...
- 小姐姐的详细SpringBoot教程之入门 连接Mysql、Druid数据源和整合MyBatis(三)
文章目录 1.整合JDBC使用 1.创建项目 2.打开项目 3.使用我们的Idea连接我们的mysql数据库 1. 5.最后,测试是否可以查询数据 6. 最后简单的实现增删改查 2.整合Druid数据 ...
- pandas使用方括号[]或者loc函数、基于列名称或者列名称列表索引dataframe中的单个数据列或者多个数据列(accessing columns of a dataframe)
pandas使用方括号[]或者loc函数.基于列名称或者列名称列表索引dataframe中的单个数据列或者多个数据列(accessing columns of a dataframe using co ...
- R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图
R语言使用ggradar包可视化基本雷达图(radar chart.蜘蛛图spider plot).可视化单个数据对象的雷达图 目录
最新文章
- 20162329 2017-2018-1 《程序设计与数据结构》第九周学习总结
- 有关scanf输入的问题
- 知识表示学习神器OpenKE:快速获取KG表示
- groovy 2.5.4_Java 7 vs Groovy 2.1性能比较
- visualize python_安利一个Python大数据分析神器!
- 聚类算法评价指标学习笔记
- 当知识图谱遇上预训练语言模型 -- 留言送书
- 用ajax获取淘宝关键字接口
- VS2015编译的OpenJDK8,会崩溃
- 海康大华网络摄像机搜索工具
- 统一社会信用代码验证
- 多线程通信Queue
- 开始报名丨CCF C³-13@奇安信:透视俄乌网络战 —— 网络空间基础设施面临的安全对抗与制裁博弈...
- 投融资项目入门和总结
- 围棋 android 开源,腾讯正式开源围棋AI技术PhoenixGo
- 小米4c android版本号,小米4c的手机系统是什么?能升级安卓5.0吗?
- Android之在设备之间传输--MediaRouter、Google Cast、Amazon Fling介绍
- Python解析wireshark所捕获的数据报
- 设计师值得收藏的5个设计网站
- 牛客国庆集训派对Day2 H	卡牌游戏 [ 期望dp ]