1. Promise的概念
Promise是ES6新增的一个异步编程解决方案,可以更加优雅地处理异步操作,避免回调地狱。Promise对象代表一个异步操作的最终完成或失败,并返回一个结果,拥有pending(进行中)、fulfilled(已成功)和rejected(已失败)三种状态。当Promise处于pending状态时,可以转化为fulfilled或rejected状态,状态转化后不可更改。
可以使用Promise代替回调函数,避免回调地狱,提高代码可读性和可维护性。
Promise的基本语法如下:
const promise = new Promise((resolve, reject) => {
//异步操作
//若成功,则调用resolve,并传入结果数据,否则调用reject
})
//then()方法可以处理Promise对象的成功状态,catch()方法可以处理Promise对象的失败状态
promise.then(result => {
//处理成功状态
}).catch(error => {
//处理失败状态
})
2. Promise的基本用法
2.1 Promise的三种状态
Promise有三种状态,分别为pending(进行中)、fulfilled(已成功)和rejected(已失败),状态转化后不可更改。
Promise的状态转化示意图如下:
Promise的基本使用示例:
const temperature = 0.6 //模拟温度
const promise = new Promise((resolve, reject) => {
if (temperature > 0.5) {
resolve('温度正常')
} else {
reject('温度过低')
}
})
promise.then(result => {
console.log(result) //输出温度正常
}).catch(error => {
console.log(error) //输出温度过低
})
2.2 Promise.all()
Promise.all()方法可以让多个Promise对象在同时执行后返回一个集合中的全部结果。只有在多个Promise对象都成功的情况下才能返回一个成功结果,如果其中一个Promise对象失败,则返回一个失败结果。
Promise.all()的使用示例:
const p1 = Promise.resolve(1)
const p2 = Promise.resolve(2)
const p3 = Promise.resolve(3)
Promise.all([p1, p2, p3]).then(results => {
console.log(results) //输出[1, 2, 3]
}).catch(error => {
console.log(error)
})
2.3 Promise.race()
Promise.race()方法可以让多个Promise对象在同时执行后返回集合中最先有结果的那个Promise对象的结果。
Promise.race()的使用示例:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('a')
}, 1000)
})
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('b')
}, 500)
})
Promise.race([p1, p2]).then(result => {
console.log(result) //输出b
}).catch(error => {
console.log(error)
})
3. Promise进阶用法
3.1 Promise.resolve()
Promise.resolve()方法是创建一个Promise实例的简写方法,可以将一个非Promise的对象或值转化为Promise对象。
Promise.resolve()的使用示例:
Promise.resolve('success').then(result => {
console.log(result) //输出success
})
Promise.resolve(new Promise((resolve, reject) => {
setTimeout(() => {
resolve('内部 Promise 成功')
}, 1000)
})).then(result => {
console.log(result) //输出内部 Promise 成功
})
3.2 Promise.reject()
Promise.reject()方法是创建一个失败状态的Promise对象,可直接返回错误信息。
Promise.reject()的使用示例:
Promise.reject('fail').catch(error => {
console.log(error) //输出fail
})
3.3 Promise.prototype.finally()
Promise.prototype.finally()方法用于指定一个无论Promise对象最后状态如何都会执行的操作,该方法是ES2018标准的一部分。finally()方法返回一个Promise对象,因此可以链式调用。
Promise.prototype.finally()的使用示例:
Promise.resolve('success').then(result => {
console.log(result) //输出success
}).finally(() => {
console.log('无论成功失败都会执行') //输出无论成功失败都会执行
})
3.4 Promise.catch()
Promise.catch()方法用于处理Promise对象的失败状态,相当于.then(null, rejection)
Promise.catch()的使用示例:
const temperature = 0.3 //模拟温度
const promise = new Promise((resolve, reject) => {
if (temperature > 0.5) {
resolve('温度正常')
} else {
reject('温度过低')
}
})
promise.then(result => {
console.log(result)
}).catch(error => {
console.log(error) //输出温度过低
})
3.5 Promise.allSettled()
Promise.allSettled()方法可以让多个Promise对象在同时执行后返回一个集合中的全部结果。与Promise.all()不同的是,Promise.allSettled()无论各个Promise对象的状态如何,都会返回一个集合对象的状态。
Promise.allSettled()的使用示例:
const ps = [Promise.resolve(1), Promise.reject('失败'), Promise.resolve(3)]
Promise.allSettled(ps).then(results => {
console.log(results) //输出 [{status: "fulfilled", value: 1}, {status: "rejected", reason: "失败"}, {status: "fulfilled", value: 3}]
})
3.6 Promise.any()
Promise.any()方法可以让多个Promise对象在同时执行后返回集合中第一个成功的那个Promise对象的结果。如果所有Promise对象都失败,则返回一个失败对象。
Promise.any()的使用示例:
const p1 = Promise.reject('失败')
const p2 = Promise.resolve('第二个成功')
const p3 = Promise.resolve('第三个成功')
Promise.any([p1, p2, p3]).then(result => {
console.log(result) //输出第二个成功
}).catch(errors => {
console.log(errors)
})
4. 总结
Promise是一个解决回调地狱的,用于更加优雅地处理异步操作的方案。通过Promise对象可以更加便捷地处理异步操作,避免状态混乱以及处理代码整洁。提升开发效率、代码可维护性、代码可读性以及代码的可重用性也是Promise最大的优点。