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 相关文章推荐
使用js在页面中绘制表格核心代码
Sep 16 Javascript
$.each与$().each的区别示例介绍
Mar 20 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
Jul 13 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
探究JavaScript中的五种事件处理程序方式
Dec 07 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
Apr 18 Javascript
vue项目优化之通过keep-alive数据缓存的方法
Dec 11 Javascript
Vue中使用vee-validate表单验证的方法
May 09 Javascript
浅析vue-router中params和query的区别
Dec 24 Javascript
js实现圆形菜单选择器
Dec 03 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
BBS(php & mysql)完整版(一)
2006/10/09 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
浅谈Vue.js组件(二)
2019/04/09 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python自省及反射原理实例详解
2020/07/06 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
公司企业表扬信
2014/01/11 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript