angular中的promise
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是原值传递
angular中的promise的更多相关文章
- angular中使用promise
promise是一种用异步的方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或者抛出的异常,在与远程对象打交道时我们可以把他看作是远程对象的一个代理. 如果说是promise也是 ...
- 浅谈angular中的promise
promise目的就是为了跳出回调地狱.老掉牙的东西,大神轻拍. 举个最简单的例子:请求数据(getData),解析数据(executeData),显示数据(showData). //获取数据 fun ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- Angularjs中的promise
promise 是一种用异步方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或抛出的异常.在与远程对象打交道非常有用,可以把它们看成一个远程对象的代理. 要在Angular中创建 ...
- Angular中的$q的形象解释及深入用法
作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...
- 形象的讲解angular中的$q与promise(转)
以下内容摘自http://www.ngnice.com/posts/126ee9cf6ddb68 promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多. ...
- promise在angular中的基本使用
promise在angular中的基本使用 <!DOCTYPE html> <html ng-app="myApp"> <head> <m ...
- 原创:形象的讲解angular中的$q与promise
promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多.promise全称是 Futures and promises.具体的可以参见 http://en ...
- Deferred在jQuery和Angular中的使用与简单实现
Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...
随机推荐
- 编译qt-mobility
因为用到了qt-mobility,必须自己编译一下,参考列出了参考资料. 参考: 1. windows下编译qt-mobility http://hi.baidu.com/xchinux/blog/ ...
- Silverlight之Styles和Behaviors
本文简介 1.定义简单的Style 2.应用Style到元素 3.动态加载Style资源文件 4.Style的继承 5.组织内编写Style(在元素内) 6.自动应用Style到指定类型元素 7.St ...
- Android 签名(1)为什么要签名
所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 签名可以: 1,用特权,2完整性鉴别,3安全保证, 1,专用权限或特权要签名 一些特权要经签名才允许.签名可用:S ...
- 1126. Magnetic Storms(单调队列)
1126 最简单的单调队列应用吧 单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增. 单调队列的大体操作 进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大 ...
- poj2750Potted Flower (线段树)
http://poj.org/problem?id=2750 之前做过类似的题 把一段的左连续最大.最小 右连续最大及最小及中间的连续更新出 就可以算出这段最大的连续和 注意不能全部加上 加上一特判 ...
- uva 489 Hangman Judge(水题)
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...
- UVa 1451 (数形结合 单调栈) Average
题意: 给出一个01串,选一个长度至少为L的连续子串,使得串中数字的平均值最大. 分析: 能把这道题想到用数形结合,用斜率表示平均值,我觉得这个想法太“天马行空”了 首先预处理子串的前缀和sum,如果 ...
- UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...
- Hibernate4.x之映射关系--多对多
n-n的关联关系分为以下两类: 1.单向n-n关联关系: n-n的关联必须使用连接表 与1-n映射类似,必须为set集合元素添加key子元素,指定CATEGORIES_ITEMS表中参照CATEGOR ...
- 使用struts的同步令牌避免form的重复提交
struts1避免重复提交 一.使用方法 1. 假如你要提交的页面为toSubmit.jsp: 2. 在打开toSubmit.jsp的Action1中加入:saveToken(request),例 ...