所谓promise,其实就是异步编程的一种解决方案。
特点:
promise对象状态不受外界影响(由异步操作的结果决定)。
- pending:进行中
- resolved(fulfilled):已完成
- rejected:已失败
一旦状态改变,将不会再变(状态凝固,保持不变)
- pending → resolved
- pending → rejected
缺点:
- 无法中途取消promise
- 如果不设置回调函数,promise内部抛出的错误无法反应到外部
- pending状态下,无法得知进展阶段
==============================================
var promise = new Promise( (resolve,reject) => {
if (/*异步操作成功*/) {
resolve(value);
} else {
reject(error);
}
} )
==============================================
注:Promise是一个构造函数,用来创建promise实例。参数为一个函数,该函数有两个参数:
- resolve:当异步操作返回成功时调用,并将结果传递给回调函数
- reject:当异步操作返回失败时调用,并将错误信息传递给回调函数
==============================================
promise.then ( (value) => {
//success
}, (err) => {
//failure
} )
==============================================
注:then方法可以传递两个回调函数作为参数(两个函数均接受promise对象传出的值作为参数)
- 第一个回调函数为Promise状态pending → resolve时调用
- 第二个回调函数为Promise状态pending → reject时调用,可选
p1和p2是两个promise实例,当p2的resolve方法将p1作为参数时:
- p1为pending状态时,p2的回调函数会等待p2状态的改变;
- p2为resolve状态时,p2的回调函数立即调用
- p2为reject状态时,p2的回调函数立即调用,但是此时p2的状态无效,以p1状态为准,触发p2回调函数中的catch方法
Promise.prototype.then()
then方法返回的是一个新的promise实例,因此可以采用链式写法(前一个回调函数执行完毕,会把返回的结果作为参数传递给下一个回调函数,以此类推)
Promise.prototype.catch()
和.then(null,reject)等价,用于指定发生错误时的回调。异步操作状态变为reject时,调用catch方法,当then方法内抛出异常时,也会被catch方法捕获
Promise.all()
用于将多个promise实例包装成一个promise实例,参数为一个包含多个promise实例的数组,如果数组元素不是promise实例,会先调用Promise.resolve方法转换为promise实例
- p1, p2, p3均为resolve时,返回的p也为resolve
- p1, p2, p3有一个为reject时,p为reject,此时第一个被reject的返回值会传递给p的回调函数
Promise.race()
参数同all方法,不同的是,当参数中的实例有一个返回率先改变状态,p的状态便随之改变。
Promise.resolve()
将现有对象转换为promise对象。
- 参数是一个promise实例时,不做修改返回。
- 参数是一个thenable(含有then方法的对象)时,会先转换为promise对象,并立即执行thenable对象内的then方法。
- 参数不是一个对象时,返回一个新的promise对象,状态为resolve。
- 当没有参数时,直接返回一个状态为resolve的promise对象。
Promise.reject()
返回一个状态为reject的promise对象。
done()
处于回调链的尾端,保证最后一个then或者catch方法抛出的错误可以接收到。
finally()
无论最后的状态是哪一个,都会执行的代码块。