目录
前言
Promise(承诺)是JavaScript中一种流行的异步编程方式,它可以有效地解决回调嵌套潜在的问题,让代码更清晰易懂。Promise对象表示异步操作的最终结果。
Promise原理包括以下几个部分
- Promise状态
Promise有三个状态,分别是 pending(等待状态)、fulfilled(完成状态)和rejected(失败状态)。
- Promise执行
Promise执行时,首先是进入等待状态。之后,通过异步操作,异步操作完成后会调用resolve()方法来将Promise对象状态和结果变更为成功状态。如果异步操作发生错误,会调用reject()方法将Promise对象状态和错误信息更改为失败状态。
- Promise链式调用
在链式调用中,每次调用都返回一个新的Promise对象。既可以实现顺序执行,也可以将多个异步操作并行执行,并且可以通过then()方法来处理异步操作的结果。处理函数可以被多个then()方法串联调用。如果某个处理函数返回一个Promise对象,则下一个处理函数将在这个Promise对象上等待。
- Promise异常处理
在链式调用中,可以使用catch()方法来捕获错误并将Promise对象状态转为失败状态。此外,Promise还支持finally()方法来在Promise执行完毕后执行一些逻辑。无论状态是成功还是失败,finally()方法都会执行。
api及用法
- Promise.resolve() 和 Promise.reject()
这两个方法可以分别返回一个以确定状态或拒绝状态为结果的 Promise 对象。
Promise.resolve('resolved value').then(function (value) {
console.log(value) // 'resolved value'
})
Promise.reject(new Error('rejected reason')).catch(function (error) {
console.error(error.message) // 'rejected reason'
})
-
Promise.prototype.then()
将回调函数添加到 Promise 实例,并返回一个新的 Promise 对象,新的 Promise 对象的状态取决于前一个 Promise 对象的状态码。Promise 对象有三种状态,分别是 pending、fulfilled、rejected。当前一个 Promise 对象状态为 fulfilled 时,新的 Promise 将进入 fulfilled 状态,并调用 onResolved 回调函数;当前一个 Promise 对象状态为 rejected 时,新的 Promise 将进入 rejected 状态,并调用 onRejected 回调函数。
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('value')
}, 1000)
})
promise.then(function (value) {
console.log(value) // 'value'
}, function (error) {
console.error(error)
})
-
Promise.prototype.catch()
用于处理 Promise 对象抛出的异常,实际上等同于 Promise.prototype.then(undefined, onRejected)。
var promise = Promise.reject(new Error('rejected reason'))
promise.catch(function (error) {
console.error(error.message) // 'rejected reason'
})
-
Promise.prototype.finally()
用于指定 Promise 对象状态变为 resolved 或 rejected 后的回调,在 Promise 对象状态变为 resolved 或 rejected 后都会执行。并返回一个新的 Promise 对象。
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('value')
}, 1000)
})
promise.then(function (value) {
console.log(value)
}).catch(function (error) {
console.error(error)
}).finally(function () {
console.log('finally')
})
-
Promise.prototype.all()
方法用于将多个 Promise 对象合并为一个 Promise 对象,当所有的 Promise 对象都变为 resolved 状态后,Promise.all() 方法返回一个新的 Promise 对象,新的 Promise 对象的结果是所有 Promise 对象结果组成的数组。
var promise1 = Promise.resolve('value1')
var promise2 = Promise.resolve('value2')
var promise3 = Promise.resolve('value3')
Promise.all([promise1, promise2, promise3]).then(function (values) {
console.log(values) // ['value1', 'value2', 'value3']
})
-
Promise.prototype.race()
用于将多个 Promise 对象合并为一个 Promise 对象,当其中任意一个 Promise 对象变为 resolved 或 rejected 状态后,Promise.race() 方法返回的 Promise 对象就会采用这个 Promise 对象的状态和值。
var promise1 = Promise.resolve('value1')
var promise2 = Promise.resolve('value2')
var promise3 = Promise.reject(new Error('rejected reason'))
Promise.race([promise1, promise2, promise3]).then(function (value) {
console.log(value) // 'value1'
}).catch(function (error) {
console.error(error.message) // 'rejected reason'
})