Promise 是异步编程的一种解决方案。 Promise 不是为了消除回调,而是让回调变的可控。
一个 Promise 必然处于以下几种状态之一:
- 待定(pending):初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled):意味着操作成功完成。
- 已拒绝(rejected):意味着操作失败。
特点
状态不受外界影响,只有异步操作的结果,决定当前是哪一种状态、一旦状态改变就不会再变(pending -->fulfilled、pending --> rejected)
用法
Promise 是以个构造函数,用来生成 Promise 实例
- Promise 构造函数接收一个函数作为参数,这个函数有两个参数
const p = new Promise(function(resolve, reject){
// resolve 函数:将 Promise 对象状态从未完成变成成功,在异步操作成功的时候调用
resolve() // 返回异步操作的结果,作为参数传递出去
// reject 函数:将 Promise 对象状态从未完成变成失败,在异步操作失败的时候调用
reject() // 返回异步操作的结果,作为参数传递出去
})
then()
当实例状态发生改变的时候的回调函数,返回一个新的 Promise 实例,也就是 Promise 可以链式调用的原因
const p = new Promise(function(resolve, reject){
setTimeout(() => {
const time = new Date().getTime()
if(time % 2 == 0){
resolve(`成功的数据,time = ` + time )
} else {
reject(`失败的数据,time = ` + time)
}
},1000)
})
p.then(value => { // resolved(已成功)的状态
console.log(value)
}, reason => { // rejected(已失败)的状态
console.log(reason)
})
catch()
用于指定发生错误的回调函数,一般来说通过 catch 替代 then 中的第二个参数
const p = new Promise(function(resolve, reject){
setTimeout(() => {
const time = new Date().getTime()
if(time % 2 == 0){
resolve(`成功的数据,time = ` + time )
} else {
reject(`失败的数据,time = ` + time)
}
},1000)
})
p.then(value => { // resolved(已成功)的状态
console.log(`成功的` + value)
}
// ,reason => { // rejected(已失败)的状态
// console.log(`失败的` + reason)
// }
).catch(err => {
console.log('失败的' + err);
})
finally()
用来指定不管 Promise 对象状态最后如何,都会执行的操作
const p = new Promise(function(resolve, reject){
setTimeout(() => {
const time = new Date().getTime()
if(time % 2 == 0){
resolve(`成功的数据,time = ` + time )
} else {
reject(`失败的数据,time = ` + time)
}
},1000)
})
p.then(value => { // resolved(已成功)的状态
console.log(`成功的` + value)
},
// reason => { // rejected(已失败)的状态
// console.log(`失败的` + reason)
// }
).catch(err => {
console.log('失败的' + err);
}).finally(() => {
console.log('最后的结果')
})