10、Promise对象状态属性
Promise 的状态
实例对象中的一个属性 【PromiseState】
- pending 未决定的
- resolved (fullfilled) 成功
- rejected 失败
promise的状态改变
- pending变为resolved
- pending变为rejected
说明:只有这两种,且一个promise对象只能改变一次。、
无论变为成功还是失败,都会有一个结果数据
成功的结果数据一般称为value,失败的结果数据一般称为reason
11、Promise对象的值属性分析
Promise 对象的值
实例对象中的另一个属性【PromiseResult】
保存着异步任务【成功/失败】的结果
- resolve()
- reject()
12、Promise工作流程
new Promise() --> pendding状态
执行异步操作
成功了,执行resolve() -> promise对象(resolved状态) -> then 回调onResloved()->新的Promise对象
失败了,执行reject() -> promise对象(rejected状态) -> then()/catch() 回调onRejected() -> 新的Promise对象
13、Promise的API构造函数、
Promise构造函数 Promise(eccutor){}
- executor函数:执行器 (resolve, reject) => {}
- resolve函数:内部定义成功时我们调用的函数 value => {}
- reject函数:内部定义失败时我们调用的函数 reason => {}
说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行
let p = new Promise((resolve, reject) => {
//同步调用
console.log(111)
})
console.log(222)
//会先显示111,后显示222,表示
Promise.prototype.then方法:(onResolved, onRejected) => {}
- onResolved函数:成功的回调函数(value)=>{}
- onRejected函数:失败的回调函数(reason)=>{} 说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调,返回一个新的promise对象
14、Promise的resolve方法
let p1 = Promise.resolve(521)
//如果传入的参数为 非Promise类型的对象,则返回的结果为成功promise对象
//如果传入的参数为Promise对象,则参数的结果决定了resolve的结果
let p2 = Promise.resolve(new Promise((resolve, reject) => {
resolve("OK")
}))
console.log(p1)
console.log(p2)
15、Promise的reject方法
let p1 = Promise.reject(521)
let p2 = Promise.reject("love")
let p3 = Promise.reject(new Promise((resolve, reject) => {
resolve("OK")
}))
console.log(p1)//状态为失败,结果为521
console.log(p2)//状态为成功,结果为love
console.log(p3)//状态为失败,结果为Promise对象
16、Promise的all方法
(promises) => {}
- promises:包含n个promise的数组。 说明 返回一个新的Promise 只有所有的promise都成功才成功,只要有一个失败了就直接失败;
let p1 = new Promise((resolve, reject) => {
resolve("OK")
})
let p2 = Promise.resolve("Success")
let p3 = Promise.resolve("Oh Yeah")
const result = Promise.all([p1,p2,p3])
console.log(result);
//状态为成功,结果是一个数组,是三个promise的成功的结果组成的数组
17、Promise的race方法
参数是promise数组,返回结果也是promise对象。
是第一个完成的promise的结果状态就是最终的结果状态。
let p1 = new Promise((resolve, reject) => {
resolve("OK")
})
let p2 = Promise.resolve("Success")
let p3 = Promise.resolve("Oh Yeah")
const result = Promise.race([p1,p2,p3])
consoel.log(ressult)
//返回为p1的返回,“OK”
//假设P1是一个异步任务
let p1 = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve("OK)
},1000)
})
//则返回为p2的返回,“Success”
18、如何改变Promise对象的状态
如何改变promise对象的状态(三种方法)
let p = new Promise((resolve, reject) => {
//1. resolve函数
resolve("OK)//可以将pending转为fulfilled或者resolved
//2. reject函数
reject("error)//可以将pending转为rejected
//3. 抛出错误
throw "出问题了"//可以将pending转为rejected
})
19、promise指定多个成功/失败的回调函数,都会调用吗?
结论: 当promise改变时, 对应状态的回调都会执行
let p = new Promise((resolve, reject) => {
resolve("OK")
})
//指定回调 1
p.then(value => {
console.log(value)
})
//指定回调 2
p.then(value => {
alert(value)
})
//控制台输出和弹窗都会出现
//如果不存在 resolve("OK") 语句的话,控制台输出和弹窗都不会出现
20、改变promise状态和指定回调函数谁先谁后
let p = new Promise((resolve, reject) => {
resolve("OK")
})
p.then(value=>{
},reason=>{
})
//有可能是resolve先改变状态,再执行then方法,(当Promise中是一个同步任务时)
//也有可能是先执行then方法,再resolve改变状态(当Promise中是一个异步任务时)
Promise中是异步任务的情况最多
fs、数据库、ajax都是异步任务
结论:
1、都有可能,正常情况下是先指定回调再改编状态,但也可以先改编状态再指定回调
2、如何先改变状态,再执行回调
1、在执行器中直接调用resolve() reject()
2、延迟更长时间才调用then()
3、什么时候才能得到数据(回调函数什么时候执行?)
1、如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据
2、如果先改变状态,那当指定回调是,回调函数就会调用,得到数据