Promise 的前世今生
一篇关于 Promise 的科普总结文。本文并不是 API 集合,如果关注具体的 API 列表和实现,请查阅 mdn。
从 es6 到现在,promise 已经发展了接近八年,我觉得是时候回头看一下他的前世今生了。
什么是 promise ?我们用他来做什么?
TODO:抛出 promise 的定义,并说明用途
没有 promise 的时代,该如何解决异步问题?
- 回调
回调函数是最早解决异步编程的方法。无论是常见的 setTimeout 还是 ajax 请求,函数都是以回调的形式在固定时间执行的。
通常,回调函数作为参数传递到函数中,并在适当的时候调用和执行。
回调函数的优点是简单,易于理解和实现,但有一个致命的缺点,就是容易出现callback地狱,即嵌套使用多个回调函数。它导致代码可读性和可维护性差,并且只能处理回调中的异常。
- 观察者和发布订阅(事件监控)
事件监控采用事件驱动模式。事件的执行不依赖于代码的顺序,而是依赖于事件的发生。
观察者和发布订阅是事件监控的两种具体实现,发布订阅相对观察者多了一个注册中心。
事件监控的方式简单易懂,可以绑定多个事件,每个事件可以指定多个回调函数,可以“解耦”,有利于模块化。缺点是整个程序会变成事件驱动,运行过程会变得非常不清晰。阅读代码时,很难看到主要流程。
promise-like
在标准化之前,各家都推出了自己的 promise 实现
angularjs 的 $q
jQuery 的 $.deferred
bluebird https://github.com/petkaantonov/bluebird
q https://github.com/kriskowal/q
TODO:描述各家开发者提出的 promise-like 实现,并介绍 deferred 方式
标准化的 promise
TODO:说明标准化 promise 的出现。描述 promise 标准,promise a+ 标准
Promise 反模式
TODO:deferred 承诺延迟的反模式和弊端
- 错误处理
进一步:generator
为什么没出现协程 http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/
TODO:generator 解决方案、yield、协程
async/await
TODO:async/await,并说明和 promise 的异同、async/await 本身的限制