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