angular中的promise用法

标签(空格分隔): angular


前言

Promise其实是一个规范,用类似then().then()这样的链式调用形式来处理因为异步带来意大利面条式的代码(多层函数嵌套)。

多层函数嵌套的原因是,因为js的异步特性,导致我们后面函数需要用到这个异步函数获取的数据或者结果时,必须要等异步函数处理完成。所以必须写在这个异步函数结尾。

Angular中的promise:$q

Angular把promise封装成了一个服务$q方便我们到处使用它。

当我们用console.log打印$q时,我们发现它是一个函数。实际还是封装了deferred对象。


var $Q = function Q(resolver) {
if (!isFunction(resolver)) {
throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver);
} var deferred = new Deferred(); function resolveFn(value) {
deferred.resolve(value);
} function rejectFn(reason) {
deferred.reject(reason);
} resolver(resolveFn, rejectFn); return deferred.promise;
};

然后我们console.log一下$q.defer()这个对象,发现控制台给我们一个Deferred对象,具体有以下方法

notify:用于通知then(),异步函数处理进度
promise:在处理做完notify,reject,或者resolve时,存储信息,然后作为一个promise对象返回
reject:数据获取失败,或处理函数出错,返回error原因
resolve:数据获取成功,返回正确的数据

使用$q方法:

  • $q是可以用在同步过程中的,我们先看在同步过程中的应用:
var app = angular.module('app',[]);
app.controller('MyCtrl',['$q','$scope','$timeout',function($scope,$q,$timeout){
var defer = $q.defer();
defer.resolve('data');
defer.reject('error');
defer.promise.then(function(data){
console.log(data);//成功时显示data
},function(error){
console.log(error);//失败显示error
})
}])

promise是一种模式,也适用于同步方式

  • 异步方式
var app = angular.module('app', []);
app.controller('MyCtrl', ['$scope', '$q', '$timeout' ,function ($scope,$q,$timeout) {
function async(sex){
var defer = $q.defer();
$timeout(function () { defer.notify("查询性别中");
if (sex == 'male') {
defer.resolve(sex);
}else {
defer.reject(sex);
} },2000);
return defer.promise;
}
var sex = 'male';
var promise = async(sex);
promise.then(function (data) {
console.log(data);
}, function (error) {
console.log(error);
},function (notify) {
console.log(notify);
});
}]);

我们在这里通过$timoue模拟异步,然后返回defer.promise。通过操作这个返回的promise给下个then函数使用。

其他方法

$q还有其他的方法,比如when,all,finally。

when:传递一个值

all:传递多个promise,必须全部执行成功,然后才能执行回调。

finally:是和then方法对应的函数,是所有的then执行完之后,然后执行他,无论成功失败,都会被执行。

这里在使用all时,需要在注意,每个defer只能传递一个值,resolve或者reject只能一个。需要用多个defer才能传递多个。

而且resolve是没有返回值的

var app = angular.module('app', []);
app.controller('MyCtrl', ['$scope', '$q', '$timeout' ,function ($scope,$q,$timeout) {
var a = $q.defer();
var b = $q.defer();
var c = $q.defer();
a.resolve('a');
b.resolve('b');
c.resolve('c');
$q.all([a.promise,b.promise,c.promise]).then(function (data) {
console.log(data);
}, function (error) {
console.log(error);
});
}]);//如果把这里的all编程when,那么后面的data就不是一个数组,而是一组promise,when是原值传递

最新文章

  1. 汇顶科技&&硬件类笔试题目
  2. java读取本地properties文件
  3. NPOI 导入,导出EXCEL
  4. NSString 截取字符串
  5. hadoop备战:hadoop,hbase兼容版本号汇总
  6. Hadoop家族学习路线图--转载
  7. DevSecOps 实施篇!系列(二)
  8. 利用switch case 来运行咱们结婚吧
  9. Effective Java 第三版——21. 为后代设计接口
  10. 个人Source Insight使用设置笔记
  11. mysql数据库 事务和索引
  12. SQL SERVER 查看占用tempDB
  13. 修改Tomcat的网页端口和指向路径
  14. 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
  15. bzoj2442
  16. Spring中applicationContext.xml详解
  17. 如何正确地在SOE中输出日志信息
  18. servlet的生命周期详解
  19. javascript 学习笔记(1)
  20. DCloud-MUI:杂项

热门文章

  1. word文档左侧显示目录
  2. 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)的解决办法
  3. pku,杨建武:文本挖掘技术
  4. bzoj1433:[ZJOI2009]假期的宿舍
  5. 各种兼容的placeholder
  6. Java中的字符串驻留(String Interning)
  7. 多线程程序设计学习(6)Producer-Consumer模式
  8. 25、BroadCastRecevier
  9. FZU1686 神龙的难题 dancing links 重复覆盖
  10. vi中如何去除高亮显示的单词