Javascript中的异步编程规范Promises/A详细介绍


Posted in Javascript onJune 06, 2014

Javascript里异步编程逐渐被大家接受,先前大家一般通过回调嵌套,setTimeout、setInterval等方式实现,代码看起来非常不直观,不看整个代码逻辑很难快速理解。Javascript里异步函数大概有I/O函数(Ajax、postMessage、img load、script load等)、计时函数(setTimeout、setInterval)等。

这些我们都很熟悉,在复杂的应用中往往会嵌套多层,甚至以为某些步骤未完成而导致程序异常,最简单的例子:比如你往DOM中注入节点,你必须等待节点注入后在操作这个节点,当大量节点注入的时候,时间往往很难把握。如果我们得代码依赖第三方api的数据。我们无法获悉一个API响应的延迟时间,应用程序的其他部分可能会被阻塞,直到它返回结果。Promises对这个问题提供了一个更好的解决方案,它是非阻塞的,并且与代码完全解耦 。

那么,我看看Javascript里异步编程,首先推荐大家看看相对来说比较流行的Promises/A规范。

Promises/A规范

注:为了便于理解,描述可能和Promises/A规范有所出入;

CommonJS之Promises/A规范,通过规范API接口来简化异步编程,使我们的异步逻辑代码更易理解。
遵循Promises/A规范的实现我们称之为Promise对象,Promise对象有且仅有三种状态:unfulfilled(未完成)、fulfilled(已完成)、failed(失败/拒绝);初始创建的时候是unfulfilled(未完成)状态,状态只可以从unfulfilled(未完成)变成fulfilled(已完成),或者unfulfilled(未完成)变成failed(失败/拒绝)。状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),状态就不能再变了。

Promises/A规范提供了一个在程序中描述延时(或将来)概念的解决方案。主要的思想不是执行一个方法然后阻塞应用程序等待结果返回后再回调其他方法,而是返回一个Promise对象来满足未来监听。fulfilled状态和failed状态都可以被监听。Promise通过实现一个then接口来返回Promise对象来注册回调:

then(fulfilledHandler, errorHandler, progressHandler);

then接口用于监听一个Promise的不同状态。fulfilledHandler用于监听fulfilled(已完成)状态,errorHandler用于监听failed(失败/拒绝)状态,progressHandler用于监听unfulfilled(未完成)状态。Promise不强制实现unfulfilled(未完成)的事件监听(例如我们知道旧版本的jQuery(1.5,1.6)的Deferred就是一个Promise的实现,但没有实现对unfulfilled(未完成)状态的监听来回调progressHandler)。

一般认为,then接口返回的是一个新的Promise对象,而不是原来的Promise对象,这个新的新的Promise对象可以理解为是原来Promise对象的一个视图,它只包含原有Promise对象的一组方法,这些方法只能观察原有Promise对象的状态,而无法更改deferred对象的内在状态。这样可以避免多个调用者之间的冲突,多个调用者可以通过改变新的Promise对象状态而不影响别的调用者。

另外,Promise提供了resolve(实现状态由未完成到已完成)和reject(实现状态由未完成到拒绝或失败)两个接口实现状态的转变。

发一张图片帮助理解一下:

Javascript中的异步编程规范Promises/A详细介绍

有了Promise,就可以以同步的思维去编写异步的逻辑了。在异步函数里,不能使用try/catch捕获异常,也不能抛出异常。有了Promise,我们可以直接显式定义errorHandler,相当于捕获异常。

以下是几个遵循Promises/A规范的类库,when,q,rsvp.js,jQuery.Deferred等等。

Javascript 相关文章推荐
jquery 跨域访问问题解决方法(笔记)
Jun 08 Javascript
js解析与序列化json数据(二)序列化探讨
Feb 01 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
Jul 26 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 Javascript
vscode 调试 node.js的方法步骤
Sep 15 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
Jun 06 #Javascript
jQuery插件开发详细教程
Jun 06 #Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 #Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 #Javascript
js检验密码强度(低中高)附图
Jun 05 #Javascript
原生js编写设为首页兼容ie、火狐和谷歌
Jun 05 #Javascript
js如何判断用户是否是用微信浏览器
Jun 05 #Javascript
You might like
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
php判断当前操作系统类型
2015/10/28 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
python基于ID3思想的决策树
2018/01/03 Python
TensorFlow损失函数专题详解
2018/04/26 Python
python实现定时提取实时日志程序
2018/06/22 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
python 实现超级玛丽游戏
2020/11/25 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
法学专业毕业生自荐信范文
2013/12/18 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书