Promise 的含义
- 出现目的:Promise 是异步编程的一种解决方案,为了解决回调地狱。
- 特点:
- 对象状态不受外界影响,只有异步操作结果可以改变状态
- 一旦状态改变就不会再变
- 缺点:
- 无法取消 Promise,一旦新建就会立即执行
- Promise 内部错误不会抛到外部
基本用法
创建一个 Promise 实例
var promise = new Promise((resolve, reject) => {
// some code...
if(/* 异步操作成功 */) {
resolve(value); // Promise状态从Pending --> Resolved
} else {
reject(error); // // Promise状态从Pending --> Rejected
}
})
Promise.prototype.then()
Promise 实例状态改变时的回调函数,将在当前脚本所有同步任务执行完成后才会执行。
let promise = new Promise((resolve, reject)=>{
console.log(1);
resolve();
})
promise.then(() => {
console.log(3);
})
console.log(2);
// 1 2 3
then()方法包含两个函数参数,第一个是 Resolved 状态的回调函数,第二个(可选)是 Rejected 状态的回调函数。
promise.then((value) => {
// success
}, (error) => {
// failure
})
then()方法返回一个新的 Promise 实例,因此可以采用链式写法。
promise.then((res) => {
return res.doSomething();
}).then((res) => {
// 若上一个then方法返回的promise状态变为Resolved时调用...
}, (err) => {
// 若上一个then方法返回的promise状态变为Rejected时调用...
})
Promise.prototype.catch()
用于指定 Promise 实例发生错误时的回调函数。
promise.then(()=> {
// ...
}).catch((error) => {
// 捕获promise内部和then方法发生的错误
console.log(error)
})
建议不要在 then 方法中定义 Rejected 状态的回调函数(即 then 的第二个参数),而应总是使用 catch 方法。因为 Promise 对象的错误具有冒泡属性,会一直向后传递,直到被捕获为止;并且 catch 方法更接近同步写法。
Promise.all()
Promise.all 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。
var p = Promise.all([p1, p2, p3]);
p.then(() => {
// 只有p1, p2, p3都为Resolved,或任一变为rejected才会调用then方法里的回调
}).catch()
p 的状态由 p1, p2, p3 决定,三者都为 Resolved 时 p 的状态才会变为 Resolved,任一 Rejected 时 p 的状态变为 Rejected,此时第一个被 Rejected 的实例的返回值传递给 p 的回调函数。
Promise.race()
var p = Promise.race([p1, p2, p3]);
只要 p1, p2, p3 任一实例改变状态,p 的状态就跟着改变