一、可读性
我们平时要阅读的所有媒体:报纸、书、新闻,我们在阅读的时候,都是从上到下一直读下去的,然而,我们的在读代码的时候,经常要跳着去读,这种阅读方式其实是反人类的,如果我们能在读代码的时候,也可以从上往下一直读下去,那么,代码就会变得可读性提高很多。
二、什么是 Promise?
Promise 是异步编程的一个解决方案,完全改变了js异步编程的写法,让异步编程变得十分的易于理解,比传统的解决方案——回调函数和事件更合理和更强大。
它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise字面上理解即承诺的意思,new一个Promise就是新建一个承诺。在新建一个承诺的时候你需要做两件事情:
- 指定承诺所需完成的事
- 设置承诺是否实现的标准
常见使用方法
ES6规定, Promise对象是一个构造函数,用来生成Promise实例。下面代码创造了一个Promise实例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */) {
resolve(value);
} else {
reject(error);
}
});
promise.then(
function(success) {
},
function(error) {
}
)
我们来看下步骤:
- new操作符调用Promise构造函数,并接受一个函数作为Promise构造函数的参数,该函数有两个参数,resolve和reject, 而resolve和reject是两个函数,由JavaScript引擎提供,不用自己部署。
- resolve用来将Promise对象的状态置为成功,并将异步操作结果value作为参数传递给成功回调函数
- reject用来将Promise对象的状态置为失败,并将异步操作结果error作为参数传递给失败回调函数
- then方法绑定两个回调函数,第一个用来处理Promise成功状态,第二个用来处理Promise失败状态。
三、Promise 状态
Promise对象有三种状态:
- Pending(进行中)
- Fulfilled(已完成,又称为Resolved)
- Rejected(已失败)
如上图所示,Promise对象有两个特点:
1、对象状态只由异步操作结果决定。resolve方法会使Promise对象由pendding状态变为fulfilled状态;reject方法或者异常会使得Promise对象由pendding状态变为rejected状态。Promise状态变化只有上图这两条路径。
2、对象状态一旦改变,任何时候都能得到这个结果。即状态一旦进入fulfilled或者rejected,promise便不再出现状态变化,同时我们再添加回调会立即得到结果。这点跟事件不一样,事件是发生后再绑定监听,就监听不到了。
四、Promise 的缺点
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
但是 Promise也有一些缺点:
- 无法取消Promise,一旦新建它就会立即执行,无法中途取消。
- 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
- 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。