异步调用必须要通过回调函数来返回数据
当我们进行一些复杂的调用时,就会出现"回调地狱"
问题:
异步必须通过回调函数来返回结果,回调函数一多会非常痛苦
Promise
- Promise可以帮助我们解决异步中的回调函数的问题
- Promise就是一个用来存储数据的容器
他拥有着一套特殊的存储数据的方式
这个方式是的它里面可以储存异步调用的结果
// 创建Promise
// 创建Promise时,构造函数中需要一个函数(执行器)作为参数
// Promise构造函数的回调函数,他会在创建Promise时调用,调用时会有两个参数传递进去
const promise = new Promise((resolve, reject) => {
// resolve和reject是两个函数,通过这两个函数可以想Promise中存储数据
// resolve在执行正常时存储数据,reject在执行错误时储存数据
// 通过函数向Promise中添加数据,好处就是可以用来添加异步调用的数据
resolve('哈哈');
});
从Promise中读取数据
- 可以通过Promise的实例方法then来读取Promise的数据
- then需要两个回调函数作为参数,回调函数用来获取Promise中的数据
通过resolve存储的数据会调用第一个函数返回,可以在第一个函数中编写处理数据的代码
通过reject存储的数据或者出现异常时会调用第二个函数返回,可以在第二个函数中编写处理异常的代码
promise.then(
result => {
console.log('promise中的数据', result);
},
reason => {
console.log('数据', reason);
}
);
Promise中维护了两个隐藏属性:
PromiseResult
- 用来存储数据
PromiseState
- 记录Promise状态(三种)
pending(进行中)
fulfilled(完成) 通过resolve存储数据时
rejected(拒绝,出错了) 出错了或通过reject存储数据时
- state只能修改一次,修改以后永远不会再变
流程:
当Promise创建时,PromiseState初始值为pending.
当通过resolve储存数据时 Promise变为fulfilled(完成)
PromiseResult变为存储的数据
当通过reject储存数据或出错时 Promise变为rejected(拒绝出错了)
PromiseResult变为存储的数据 或 异常对象
当通过then读取数据时,相当于为Promise设置了2个回调函数
如果PromiseState变为fulfilled,则调用第一个回调函数返回数据
如果PromiseState变为rejected,则调用第二个回调函数返回数据
then中的代码一定最后执行
catch()用法与then类似,但是只需要一个回调函数作为参数
catch()中的回调函数只会在Promise被拒绝时才会调用
catch()相当于then(null,reason => {})的简写
一般都用then处理正常数据,用catch处理异常的数据
catch()就是一个专门处理Promise异常的方法
finally() (很少用)
- 无论是正常存储数据还是出现异常都会执行
- 但是finally的回调函数中不会接收到数据
- finally()通常用来编写一些无论成功与否都要执行的代码
promise.catch(reason => {
console.log(2222222222);
});
promise.finally(() => {
console.log('没有什么能够阻挡');
});