本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、promise含义
抽象表达:js中进行异步编程的解决方法(以前是纯回调)
具体表达:从语法上讲promise是一个构造函数,功能上来说:promise对象用来封装一个异步操作并可以获取其结果。
二、promise 的状态改变
从pending变为fulfilled(成功)
从pending变为rejected(失败)
一个promise对象只能改变一次,成功或者失败都有一个结果数据,成功是结果是value,失败的结果是reason.
new Promise((resolve,reject) => {
resolve() //padding(待定)
reject()
}).then(res => {
console.log(res) //resolved(成功)
}).catch(err => {
console.log(err) //rejected(失败)
})
三、使用方法
// Promise里面传入执行器函数
new Promise((resolve, reject) => {
setTimeout(() => {
resolve("成功的数据");
reject("失败的数据");
}, 0)
}).then(
// 成功的回调
value => {
console.log("onResolved", value);
}
).catch(
// 失败的回调
reason => {
console.log("onRejected", reason);
}
)
resolve传参
- 传入一个字符串,padding - resolved
- 传入一个Promise,状态由新传入的Promise状态决定
- 传入一个对象,并且对象中实现了then方法,会执行then方法,并且由then方法决定后续状态。
四、为什么要使用promise
- 指定回调函数的方式更灵活:旧的在启动异步任务前指定回调函数,promise任何时期都可以,执行结果之后也可以
- 支持链式调用,可以解决回调地狱问题(回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数的执行条件)
回调地狱不便于阅读和异常处理:promise链式调用(还有回调函数),async/await
五、promise的作用
- 主要用于异步计算
- 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
- 可以在对象之间传递和操作promise
六、promise对象方法
then-成功时调用
const promise = new Promise((resolve, reject) => {
resolve(1);
});
promise.then((res) => {
console.log(res);
});
promise.then((res) => {
console.log(res);
return 'ccc'
}).then(re => {
console.log(re)
})
//多次调用then方法,都会执行
then传入的回调函数可以有返回值
- then方法本身有返回值,是一个Promise对象
- 如果返回一个普通值,这个值会被做为一个新的Promise的resolve值
catch-失败时候调用
finally-无论是resolve状态还是reject状态都会执行
const promise = new Promise((resolve, reject) => {
resolve(1);
});
promise
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log("finally");
});
七、类方法
resolve
const obj = {name:'123'}
const promise = Promise.resolve(obj)
promise.then(res => {
console.log(res)
})
reject
all--传入的所有promise状态都变成resolved时候在执行
const p1 = new Promise((resolve,reject) => {
resolve(1111)
})
Promise.all([p1,p2,p3,'aaa']).then(res => {
console.log(res) //返回结果的数组
})
allSettled --传入的所有promise状态都变成resolved或rejected时候在执行
race(竞赛) -- 传入的所有promise状态中一个变成resolved时候就执行,有一个为reject,就是执行catch
Promise.race([p1,p2,p3]).then(res => {
console.log(res) //返回结果的数组
})