$q的基本用法

function fn() {
var defer = $q.defer();
setTimeout(function () {
console.log(1);
defer.resolve(6);
}, 2000);
return defer.promise;
} fn().then(function (data) {
console.log(data); //2000ms后打印6
}).catch(function (err) {
console.error(err);
});
//或者用$q.when(fn()), 和上面是同样的效果
$q.when(fn()).then(function (data) {
console.log(data);
}).catch(function (err) {
console.error(err);
});

$q多个promise串行

function f1() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(1);
}, 2000);
return defer.promise;
} function f2() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(2);
}, 2000);
return defer.promise;
} function f3() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(3);
}, 2000);
return defer.promise;
} //f1进行完,在进行f2,然后进行f3,后一个程序等待前一个完成
f1().then(function (data) {
console.log(data); // 2s后打印1
return f2();
}).then(function (data) {
console.log(data); // 再过2s后打印2
return f3();
}).then(function (data) {
console.log(data);  // 再过2s后打印3
});

$q.all

$q.all是用于执行多个异步任务进行回调,它可以接受一个promise的数组,或是promise的hash(object)。任何一个promise失败,都会导致整个任务的失败。

$q.all中接收多个promise是同时进行的。

例1:接受一个promise的hash(object):

<!DOCTYPE html>
<html ng-app="app">
<head>
<title></title>
<script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>
<body>
<div ng-controller="ctrl1">
</div>
<script>
var app = angular.module('app',[]);
app.controller('ctrl1',['$scope','$q',function($scope,$q){
var deferA = $q.defer();
setTimeout(function(){
deferA.resolve('this is DATA A')
},500);
var deferB = $q.defer();
setTimeout(function(){
deferB.resolve('this is DATA B');
},1000);
var p=$q.all({
dataA:deferA.promise,
dataB:deferB.promise
})
p.then(function(result){
console.log(result.dataA); // this is DATA A
console.log(result.dataB); // this is DATA B
})
.catch(function(error){
console.error(error);
})
}]) </script>
</body>
</html>

例2:接受一个promise数组:

<!DOCTYPE html>
<html ng-app="app">
<head>
<title></title>
<script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>
<body>
<div ng-controller="ctrl1">
</div>
<script>
var app = angular.module('app',[]);
app.controller('ctrl1',['$scope','$q',function($scope,$q){
var deferA = $q.defer();
setTimeout(function(){
deferA.resolve('this is DATA A')
},500);
var deferB = $q.defer();
setTimeout(function(){
deferB.resolve('this is DATA B');
},1000);
var p=$q.all([
deferA.promise,
deferB.promise
]);
p.then(function(result){
console.log(result[0]); // this is DATA A
console.log(result[1]); // this is DATA B
})
.catch(function(error){
console.error(error);
})
}]) </script>
</body>
</html>

参考:http://blog.csdn.net/shidaping/article/details/52398925

最新文章

  1. RabbitMQ修改端口号和心跳时间
  2. HttpClient (POST GET PUT)请求
  3. C#遍历文件夹下所有文件
  4. String 与 StringBuffer的区别
  5. C# 词法分析器(六)构造词法分析器
  6. 基于LoadRunner构建接口测试框架
  7. Ceph的状态错误
  8. 《Head First 设计模式》ch.2 观察者(Observer)模式
  9. SpringMVC 避免IE执行AJAX时,返回JSON出现下载文件
  10. MYSQL源码 与 DBUG
  11. NSFileManager文件管理
  12. WF编译报错
  13. [置顶] block一点也不神秘————如何利用block进行回调
  14. InnoDB关键特性之change buffer
  15. Linux学习(十三)du、df、fdisk磁盘分区
  16. Web Api HttpWebRequest 请求 Api 及 异常处理
  17. 2D-2D:对极几何 基础矩阵F 本质矩阵E 单应矩阵H
  18. so beautiful so white
  19. 如何让 KiCad EDA 5.1 不显示铺铜
  20. Linux下Oracle表空间及用户创建

热门文章

  1. css 图片增加模糊效果
  2. Oracle创建表时Storage参数具体含义
  3. 【前端开发】解决ios设备上fixed浮动的input输入框兼容问题
  4. 1 Python数据类型--
  5. Ajax检测用户名是否已经注册
  6. ACM==迷茫
  7. poj 2230详解
  8. 微信企业号JS-SDK选择图片、上传图片
  9. JS分号 惹的坑
  10. 【java学习笔记】正则表达式