10、Promise对象状态属性

246 阅读4分钟

10、Promise对象状态属性

Promise 的状态

实例对象中的一个属性 【PromiseState】

  • pending 未决定的
  • resolved (fullfilled) 成功
  • rejected 失败

promise的状态改变

  1. pending变为resolved
  2. 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对象

微信截图_20211208222319.png

13、Promise的API构造函数、

Promise构造函数 Promise(eccutor){}

  1. executor函数:执行器 (resolve, reject) => {}
  2. resolve函数:内部定义成功时我们调用的函数 value => {}
  3. reject函数:内部定义失败时我们调用的函数 reason => {}

说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行

let p = new Promise((resolve, reject) => {
    //同步调用
    console.log(111)
})
console.log(222)
//会先显示111,后显示222,表示

Promise.prototype.then方法:(onResolved, onRejected) => {}

  1. onResolved函数:成功的回调函数(value)=>{}
  2. 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) => {}

  1. 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、如果先改变状态,那当指定回调是,回调函数就会调用,得到数据