一个 promise 在在代码中体现出来就是一个对象,该对象一般保存一个异步执行的任务。
Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了 Promise
对象。表示是一个未来的事情,可能做到,也可能失败。Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise 对象
从语法上说,Promise是一个对象,从它可以获取异步操作的结果。
Promise对象代表一个异步操作,有三种状态:
- Pending(进行中)
- Resolved(已完成,又称Fulfilled)
- Rejected(已失败)
只有异步操作的结果,可以决定当前是哪一种状态。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
一个读文件的例子:
|
|
解决异步调用问题
|
|
封装 Promise 版本的读取文件方法。
|
|
封装 Promise 版本的读写文件方法。
|
|
基本使用
Promise.all()
Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。
|
|
Promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。
p的状态由p1、p2、p3决定,分成两种情况:
只有p1、p2、p3的状态都变成fulfilled ,p的状态才会变成fulfilled
- 此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected
- 此时第一个被reject的实例的返回值,会传递给p的回调函数。
封装异步并行读取文件 Promise 的另外一个版本
|
|
以读文件为例子,封装 Promise API:
|
|
Promise.race()
Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。
|
|
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的回调函数。
并行执行一系列的异步任务,只要有一个异步任务完成,那业务就完成。
|
|