什么是Promise?
Promise 是ES6引入的一种异步编程解决方案,它代表了一个异步操作的最终完成(或失败)及其结果值。
一个 Promise
在生命周期中有三种状态:
- Pending(进行中):初始状态,既不是成功,也不是失败状态。
- Fulfilled(已成功):表示操作成功完成。
- Rejected(已失败):表示操作失败。
// 创建一个新的Promise对象
let promise = new Promise((resolve, reject) => {// 这里是异步操作// 当异步操作成功时,调用resolve()方法// 当异步操作失败时,调用reject()方法
});
Promise的使用方式
Promise对象的使用方式主要包括以下几个步骤:
- 创建Promise对象:通过
new Promise()
创建,传入一个执行器函数,执行器函数接收两个参数,分别是resolve
和reject
。resolve
函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending
变为Fulfilled
),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject
函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending
变为Rejected
),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
// 创建一个新的Promise对象
let promise = new Promise((resolve, reject) => {// 这里是异步操作// 当异步操作成功时,调用resolve()方法// 当异步操作失败时,调用reject()方法
});
- 处理结果:使用
.then()
方法处理成功的结果,或者使用.catch()
方法处理错误。.then
方法接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Fulfilled
时调用,该函数的参数是异步操作返回的结果。第二个回调函数是Promise对象的状态变为Rejected
时调用,该函数的参数是异步操作报出的错误。
// 使用.then()方法处理成功的结果
promise.then(value => {// 这里是处理成功结果的代码
}).catch(error => {// 使用.catch()方法处理错误// 这里是处理错误的代码
});
Promise的技巧
- 链式调用:可以将多个
.then()
连接在一起,形成一个Promise链。每个.then()
都返回一个新的Promise,可以在其上再调用.then()
。前一个Promise的返回值,会作为下一个Promise的输入。
// 创建一个Promise链
promise.then(value => {// 处理成功结果// 返回一个新的Promisereturn anotherPromise;
}).then(value => {// 处理anotherPromise的结果
});
- 错误处理:在Promise链的末尾添加一个
.catch()
,可以处理链中任何一个Promise的错误。如果Promise状态已经变成Rejected
,且后面没有别的.catch()
更低层次的.catch()
,则会处理它。
// 在Promise链的末尾添加一个.catch()
promise.then(value => {// 处理成功结果return anotherPromise;
}).then(value => {// 处理anotherPromise的结果
}).catch(error => {// 处理任何错误
});
- 并行处理:使用
Promise.all()
可以并行处理多个Promise。Promise.all()
方法接受一个Promise的数组作为参数,包装成一个新的Promise实例。只有所有的Promise的状态都变成Fulfilled
,Promise.all()
的状态才会变成Fulfilled
,返回值将组成一个数组,传给.all()
的回调函数。只要数组中有一个Promise的状态变为Rejected
,Promise.all()
的状态就变为Rejected
,第一个被reject的Promise的返回值,会传递给.all()
的回调函数。
// 创建一个Promise数组
let promises = [promise1, promise2, promise3];
// 使用Promise.all()并行处理所有的Promise
Promise.all(promises).then(values => {// 所有promises都成功时执行
}).catch(error => {// 任何一个promise失败时执行
});