promise关键点

1,如何改变 promise 的状态?

  ①resolve(value):如果当前是pending就会变为 resolved

  ②reject ( value ) :如果当前是pending 就会变为 rejected

  ③抛出异常:如果当前是 pending 就会变为 rejected

      

 2,一个promise 指定多个成功 / 失败的回调函数,都会调用吗?

  当promise改变为对应状态时都会调用

    let p=new Promise((resolve,reject)=>{
        reject(2);  //promise变为rejected失败状态
    })

    p.then(
        value=>{
            console.log("成功了aaa:",value) 
        },
        reason=>{
            console.log("出错了aaa",reason) 
        }
    )

    p.then(
        value=>{
            console.log("成功了bbb",value) 
        },
        reason=>{
            console.log("出错了bbb:",reason) 
        }
    )

    //出错了aaa   2
    //出错了bbb   2

 

3,改变 promise 状态和指定回调函数谁先谁后?

  ①都有可能,正常情况下是先指定回调再改变状态,但也可以先改状态再指定回调

  ②如何先改状态再指定回调

    在执行器中直接调用 resolve()  /  reject( ) 

    延迟更长时间才调用 then( )

  ③什么时候才能得到数据

    如果先指定回调,那当状态发生改变时,回调函数就会调用,得到数据

    如果先改变状态,那当指定回调时,回调函数就会调用,得到数据 

    //常规:先指定回调,后改变状态
    new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(1) //后改变状态(同时指定数据),异步执行回调函数
        },1000)
    }).then( //先指定回调函数,保存当前指定的回调函数
        value=>{
            console.log("value1:",value)
        },
        reason=>{
            console.log("reason1:",reason)
        }
    )
    //value1:1(等待1s)

    
    //先改状态,后指定回调函数
    new Promise((resolve,reject)=>{
        resolve(2) //先改变状态(同时指定数据)
    }).then( //后指定回调函数,异步执行回调函数
        value=>{
            console.log("value2:",value)
        },
        reason=>{
            console.log("reason2:",reason)
        }
    )
    //value2:2

 

4,promise.then()返回的新的 promise 的结果由什么决定?

  ①由 then() 指定的回调函数执行的结果决定

    如果抛出异常,新的 promise 变为 rejected,reason为抛出的异常

    如果返回的是非 promise 的任意值,新的 promise变为 resloved,value为返回的值

    如果返回的是另一个新的promise,此 promise 的结果就会成为新的 promise 的结果

     

     

     

     

     

5,promise 如何串联多个操作任务?

  ①promise的 then() 返回一个新的 promise,可以看成 then() 的链式调用

  ②通过 then() 的链式调用串连多个 同步 / 异步任务

new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log("执行任务1(异步)")
            resolve('任务1启动~')
        },1000)
    }).then(
        value=>{
            console.log('任务1的结果:',value)
            console.log('执行任务2(同步)')
            return '任务2启动~'
        }
    ).then(
        value=>{
            console.log('任务2的结果:',value)
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    console.log('执行任务3(异步)')
                    resolve('任务3启动~')
                },1000)
            }).then(
                value=>{
                    console.log('任务3的结果:',value)
                }
            )
        }
    )

    //执行任务1(异步)
    //任务1的结果: 任务1启动~
    //执行任务2(同步)
    //任务2的结果: 任务2启动~
    //执行任务3(异步)
    //任务3的结果: 任务3启动~

  异步任务需要放在 promise中,同步任务可以直接 return

 

6,promise 异常传透

  ①当使用 promise 的 then 链式调用时,可以在最后指定失败的回调

  ②前面任何操作出了异常,都会传到最后失败的回调中处理

   

  相当于:

  

 

7,中断 promise链

  ①当使用 promise 的链式调用时,在中间中断,不再调用后面的回调函数

  ②办法:在回调函数中返回一个 pending 状态的 promise对象

     

 

 

 

 

 

 

 

  

 

 

 

  

 

posted @ 2020-05-28 19:33  shanlu  阅读(151)  评论(0编辑  收藏  举报