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的说明)的更多相关文章
- Q in Q
		
简介 Q in Q技术(也称Stacked VLAN 或Double VLAN).标准出自IEEE 802.1ad,将用户私网VLAN Tag封装在公网VLAN Tag中,使报文带着两层VLAN Ta ...
 - OLEDB数据源和目标组件
		
在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...
 - Catalyst揭秘 Day8 Final 外部数据源和缓存系统
		
Catalyst揭秘 Day8 Final 外部数据源和缓存系统 今天是Catalyst部分的收官,主要讲一些杂项内容. 外部数据源处理 什么叫外部数据源,是SparkSql自己支持的一些文件格式,以 ...
 - Oracle单个数据文件超过32G后扩容
		
Oracle单个数据文件超过32G后扩容 表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定.DB_BLOCK_SIZE参数可以设置为4K.8K. ...
 - JDBC五数据源和数据池(web基础学习笔记十一)
		
一.为什么使用数据源和连接池 现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接. ...
 - Druid学习之路 (三)Druid的数据源和段
		
作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9703204.html 转载请注明出处 Druid的数据源和分段 Druid的数据存储在"Da ...
 - 虚拟化(五):vsphere高可用群集与容错(存储DRS是一种可用于将多个数据存储作为单个数据存储群集进行管理的功能)
		
vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...
 - KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)
		
http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降 ...
 - angular中$q用法, $q多个promise串行/同步/等待), $q.all用法,使用
		
$q的基本用法 function fn() { var defer = $q.defer(); setTimeout(function () { console.log(1); defer.resol ...
 
随机推荐
- ES6语法糖集锦
			
sublime3安装Es6插件 javascriptNext,然后安装即可 JavaScriptNext - ES6 Syntax()高亮插件 -------------------------- ...
 - PPTP的搭建
			
一.准备 1.检查是否支持pptp modprobe ppp-compress-18 && echo yes yes支持 2.是否开启tun cat /dev/net/tun 返回ca ...
 - list map接口传递
			
1.传参时可以设置为jsonArray的格式 JSONArray array = new JSONArray(); JSONObject json = new JSONObject(); json.p ...
 - C#通过post发送接收数据流
			
发送数据流方法 /// <summary> /// /// </summary> /// <param name="url">目标url< ...
 - bzoj3994: [SDOI2015]约数个数和(反演+结论?!)
			
这题做的历程堪称惊心动魄 刚刚学了莫比乌斯反演的我高高兴兴的和cbx一起反演式子 期间有突破,有停滞,有否定 然后苟蒻的我背着cbx偷偷打开了题解 看到了 我...... 去你的有个性质啊(当然还是自 ...
 - Java IO(三)--字节流基本使用
			
I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...
 - dedecms部分文章出现读取附加信息出错的解决办法
			
问题: 估计是新版本开发的时候,没有考虑旧版,文章内容为空的新闻,新版不在允许文章内容为空的新闻,这样旧版的内容为空的新闻升级后将无法再编辑. 解决:你可以对如下文件进行如下修改:article_ed ...
 - Maven的pom报错的解决方法
			
如果在MyEclipse里面导入项目,导入不了,如下图 接下来可以点击Import Maven Projects里的Action那一行Resolve Later. 点击Do Not Execute(a ...
 - 笔试算法题(41):线索二叉树(Threaded Binary Tree)
			
议题:线索二叉树(Threaded Binary Tree) 分析: 为除第一个节点外的每个节点添加一个指向其前驱节点的指针,为除最后一个节点外的每个节点添加一个指向其后续节点的指针,通过这些额外的指 ...
 - ecshop 修改支持php7 方案
			
修改方法 http://jsb.php-php.com/2016/05/472/ 修改数据库配置 data/config.php