什么是 Promise?
一个 Promise 对象代表一个目前还不可用,但是在未来的某个时间点可以被解析的值。它允许你以一种同步的方式编写异步代码。例如,如果你想要使用 Promise API 异步调用一个远程的服务器,你需要创建一个代表数据将会在未来由 Web 服务返回的 Promise 对象。唯一的问题是目前数据还不可用。当请求完成并从服务器返回时数据将变为可用数据。在此期间,Promise 对象将扮演一个真实数据的代理角色。接下来,你可以在 Promise 对象上绑定一个回调函数,一旦真实数据变得可用这个回调函数将会被调用。
Promise 对象曾经以多种形式存在于许多语言中。
去除厄运的回调金字塔(Pyramid of Doom)
Javascript 中最常见的反模式做法是回调内部再嵌套回调。
1 | // 回调金字塔 |
引入 Promises 之后的代码
1 | promiseSomething() |
Promises 将嵌套的 callback,改造成一系列的.then
的连缀调用,去除了层层缩进的糟糕代码风格。Promises 不是一种解决具体问题的算法,而已一种更好的代码组织模式。接受新的组织模式同时,也逐渐以全新的视角来理解异步调用。
各个语言平台都有相应的 Promise 实现
- Java’s java.util.concurrent.Future
- Python’s Twisted deferreds and PEP-3148 futures
- F#’s Async
- .Net’s Task
- C++ 11’s std::future
- Dart’s Future
- Javascript’s Promises/A/B/D/A+
Promises/A 规范
promise 表示一个最终值,该值由一个操作完成时返回。
- promise 有三种状态:未完成 (unfulfilled),完成 (fulfilled) 和失败 (failed)。
- promise 的状态只能由未完成转换成
完成
,或者未完成转换成失败 。 - promise 的状态转换只发生一次。
promise 有一个 then 方法,then 方法可以接受 3 个函数作为参数。前两个函数对应 promise 的两种状态 fulfilled 和 rejected 的回调函数。第三个函数用于处理进度信息(对进度回调的支持是可选的)。
1 | promiseSomething().then(function(fulfilled){ |