使用回调表达程序异步性和管理并发的两个主要类别的不足:缺乏顺序性和缺乏可靠性。
Promise正在像风暴一样席卷JS世界,因为开发者和语言规范作者之流拼命地想要在他们的代码/设计中结束回调地狱的疯狂。
什么是Promise?
Promise是这样一种工具:它能非常明显地看出使用者是否理解了它是为什么和关于什么,还是仅仅学习和使用API。
1.未来的值
这个占位符号实质上使这个值与时间无关。它是一个未来的值。
换句话说,一旦我的未来的值准备好,我就用我的许诺值换回值本身。
明确地创建并返回了一个事件监听能力,调用方代码接收并在它上面注册了两个事件监听器。
未来的值的一个重要性质:它们既可以表示成功也可以表示失败。
2.现在和稍后的值
为了一致地处理现在和稍后,我们将它们都作为稍后:所有的操作都变成异步的。
3.Promise值
因为Promise包装了时间相关的状态——等待当前值的完成或拒绝——从外部看来,Promise本身是时间无关的,如此Promise就可以用可预测的方式组合,而不用关心时间或底层的结果。
另外,一旦Promise被解析,它就永远保持那个状态——它在那个时刻变成了一个不可变的值——而且可以根据需要被监听任意多次。
注意:因为Promise一旦被解析就是外部不可变的,所以现在将这个值传递给任何其他团体都是安全的,而且我们知道它不会被意外或恶意地被修改。这在许多团体监听同一个Promise的解析时特别有用。一个团体去影响另一个团体对Promise解析的监听能力是不可能的。不可变性听起来是一个学院派话题,但它实际上是Promise设计中最基础且最重要的方面之一,因此不能将它随意地跳过。
Promise是一种用来包装与组合未来值,并且可以很容易复用的机制。
4.完成事件
作为一种流程控制机制——俗称“这个然后那个”。
5.Promise“事件”
注意:我们监听的Promise解析“事件”并不是严格的事件(虽然它们为了某些目的表现得像事件),而且它们也不经常称为"completion"或"error"。相反,我们用then(..)来注册一个"then"事件。或者也许更准确地讲,then(..)注册了"fulfillment(完成)"和/或"rejection(拒绝)"事件,虽然我们在代码中不会看到这些名词被明确地使用。
注意:在new Promise( function(..){ .. } )中展示的模式通常被称为“揭示构造器(revealing constructor)”。被传入的函数被立即执行(不会被异步推迟,像then(..)的回调那样),而且它被提供了两个参数,我们叫它们resolve和reject。这些是Promise的解析函数。resolve(..)一般表示完成,而reject(..)表示拒绝。