最近看到好多文章都在讲Promise,为何如今异步编程会受到如此重视?又为何异步编程要选择Promise呢?javascript
先来讲说第一个问题,异步编程能受到如此重视很大缘由是由于javascript正在逐渐走向标准化、规范化(MVC,模块,OOP),因此一些传统编程领域的规范化约束发挥的做用也愈来愈大了,并且javascript自己就是围绕"异步"来进行的,不管是浏览器端仍是node服务器端,大多数的API都是经过"事件"来将请求和返回值分离的。简单来讲:javascript受到了重视了,而它自己呢异步编程偏多.java
接下来即是第二个问题,异步编程为何要选择promise呢?上面说到了"事件",讲到"事件"是必定离不开回调的。而回调呢,做为传统的实现异步编程有三大方法(回调、事件监听、发布/订阅)之一,实现起来是不太利索的,一层层的回调嵌套足够让你陷入"回调地狱",大大下降了程序逻辑的可读性。因此这时候,Promise救世主(先知)出现了,Promise是CommonJS工做组规范制定出来的一种机制,为了给异步编程提供统一的接口,实现规范化的异步编程管理,并且when/then的链式写法让流程清晰明了.它的做用场景主要是用于耗时的场景(在node中问题比较凸显,由于node自己就是异步编程驱动的),好比与后台交互的AJAX、Socket以及某一模块存在大量回调嵌套时。node
简单介绍以后呢,咱们来看看它的工做流程(图) Promise返回状态 -- > then接收状态,并使用回调处理相应状态:编程
Promise为实例对象,该对象接收一个或者多个参数请求(多个请求时使用when(f1,f2)),最终返回的是一个有限状态机,拥有如下状态:promise
返回状态后then(onResolve,onReject)对相应的状态作出相应的onXXX回调处理,then(onResolve,onReject)是个链式方法,让使用者分别处理成功失败.浏览器
有一个Deffered对象(到目前为止,我对Deffered的认识仍是模模糊糊的)服务器
最后列出支持Promise的经常使用框架:浏览器自带new Promise API、jQuery里的$.deferred() 、AngularJs 里的$q.defer()、dojo里的Promise抽象基类以及服务器端node上的Promise库框架
或者能够本身搭建实现一个Promise框架.异步