Angular中的Promise对象($q介绍)


Posted in Javascript onMarch 03, 2015

在用JQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。

Promise

Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。

我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。

ES6中Promise、angularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下:

每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。

1.pending状态:可以过渡到履行或拒绝状态。
2.fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。
3.rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。

状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。

function okToGreet(name){

    return name === 'Robin Hood';

}

 

function asyncGreet(name) {

    var deferred = $q.defer();

 

    setTimeout(function() {

     // 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变

        $scope.$apply(function() {

            deferred.notify('About to greet ' + name + '.');

 

            if (okToGreet(name)) {

                deferred.resolve('Hello, ' + name + '!');

            } else {

                deferred.reject('Greeting ' + name + ' is not allowed.');

            }

        });

    }, 1000);

 

    return deferred.promise;

}

 

var promise = asyncGreet('Robin Hood');

promise.then(function(greeting) {

    alert('Success: ' + greeting);

}, function(reason) {

    alert('Failed: ' + reason);

}, function(update) {

    alert('Got notification: ' + update);

});

Q Promise的基本用法

上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步操作成功,则用resolve方法将Promise对象的状态变为“成功”(即从pending变为resolved);如果异步操作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。

JS将要有原生Promise,ES6中已经有Promise对象,firefox和Chrome 32 beta版本已经实现了基本的Promise API

AngularJs中的$q.defferd

通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将Promises/A规范中的三个任务状态通过API关联。

deffered API

deffered 对象的方法

1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。
2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。
3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。

deffered 对象属性

promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。

Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

promise 对象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。
2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式
3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅 完整文档规范.

通过then()方法可以实现promise链式调用。

promiseB = promiseA.then(function(result) {  

  return result + 1;  

});  

 

// promiseB 将会在处理完 promiseA 之后立刻被处理,  

// 并且其  value值是promiseA的结果增加1

$q的其他方法

$q.when(value):传递变量值,promise.then()执行成功回调
$q.all(promises):多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象

Javascript 相关文章推荐
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
Feb 04 Javascript
jquery、js操作checkbox全选反选
Mar 12 Javascript
file控件选择上传文件确定后触发的js事件是哪个
Mar 17 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
Javscript调用iframe框架页面中函数的方法
Nov 01 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
jQuery实现进度条效果代码
Dec 17 Javascript
使用JavaScript获取URL中的参数(两种方法)
Nov 16 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
Sep 21 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 #Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 #Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
Mar 03 #Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 #Javascript
JS实现鼠标点击展开或隐藏表格行的方法
Mar 03 #Javascript
浅谈JavaScript数据类型
Mar 03 #Javascript
JavaScript中property和attribute的区别详细介绍
Mar 03 #Javascript
You might like
十大“创意”战术!
2020/03/04 星际争霸
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
深入理解js中this的用法
2016/05/28 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
微信小程序实现图片上传
2019/05/23 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
Flask之flask-script模块使用
2018/07/26 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
庆八一活动方案
2014/01/25 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
应届生自荐书
2014/06/23 职场文书
信访维稳承诺书
2015/05/04 职场文书
培训讲师开场白
2015/06/01 职场文书
如何写好开幕词?
2019/06/24 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python