Promise是什么?
作用:支持链式调用,解决回调地狱问题
抽象表达:
Promise是一门新的技术(ES6规范)
Promise是JS中进行异步编程的新解决方案,旧方案是使用回调函数
具体表达:
从语法上来说:Promise是一个构造函数
从功能上来说Promise对象用来封装一个异步操作并可以获取成功失败的结果值
属于异步操作
fs
文件模块、数据库操作、ajax、定时器
Promise三个状态
pending
: 初始状态,既不是成功,也不是失败状态。
fulfilled
: 意味着操作成功完成。
rejected
: 意味着操作失败。
状态一旦从pending
变为成功或失败就不能再改变了
Promise具体操作
-
new Promise
创建一个实例
//伪代码
let p = new Promise((resolve,reject)=>{
if(成功) {
resolve('ok')
} else {
reject('err')
}
})
- Promise实例有两个保存值的方法:
resolve
保存成功的值,reject
保存失败的值 -
then
方法,第一个回调函数value => {}
接收resolve保存成功的值,第二个回调函数reason => {}
接收错误信息或reject保存的值
p.then(value => {
console.log(value)
},reason => {
console.warn(reason)
})
平常使用也可省略第二个参数
p.then(value => {
console.log(value)
})
-
catch
方法,失败进入该方法
p.catch(err => {
console.log(err)
})
-
finally
方法,无论成功或失败都可以进入该方法
p.finally(err => {
console.log(err)
})
Promise函数的方法
Promise.resolve() 方法 返回一个成功/失败对象
Promise.reject() 方法 返回一个失败对象
Promise.all()方法
包含n个promise的数组,(promises) =>{}
返回一个新的promises,只有所有成功才成功,只要有一个失败则都失败
let p1 = Promise.resolve('cccc')
let p2 = Promise.resolve('cccc2')
Promise.all{[p1,p2]}
Promise.race方法
包含n个promise的数组
(promises) =>{}
返回一个新的promises,最终结果是第一个promise执行的结果
如何改变Promise状态
-
resolve()
peding => fulfilled ( resolved) -
reject()
peding=>rejected thow '出问题了'
一个promise指定多个成功/失败回调函数,都会调用吗?
当promise改变为对应状态时会调用
改变promise状态和指定回调函数谁先谁后
- 都有可能,正常情况下是先指定回调函数再改变状态,但也可以先改变状态再指定回调
- 如何先改状态再指定回调?
a.在执行器中直接调用resolve()/reject()
b.延迟更长时间才调用then() - 什么时候才能得到数据
如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据
如果先改变状态,那当指定回调时,回调函数就会调用,得到数据
promise.then()返回新的promise的结果的状态由什么决定?
then()指定的回调函数执行的结果决定
排出错误 失败
返回结果不是promise对象 成功
返回对象是promise对象 是失败/成功
promise如何串联多个任务
then 返回一个新的promise
promise异常穿透
catch
中断promise链
返回一个padding状态的promise对象
return new Promise(() => {})