zoukankan      html  css  js  c++  java
  • 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对象

         

      

      

  • 相关阅读:
    你必须知道的495个C语言问题,学习体会四
    ++操作符重载代码分析
    正斜杠 与反斜杠之争
    文件操作基础入门
    你必须知道的495个C语言问题,学习体会三
    你必须知道的495个C语言问题,学习体会二
    【皇甫】☀别进来 千万别进来
    【皇甫】☀设计_模式
    【皇甫】☀七个小矮人和一个小博
    【皇甫】☀游戏还有游戏还是游戏
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12980184.html
Copyright © 2011-2022 走看看