zoukankan      html  css  js  c++  java
  • promise基本使用

    Promise是JS进行异步编程的新的解决方案(旧的是纯回调)

      语法上:Promise是一个构造函数

      功能上:Promise对象用来封装一个异步操作并可以获得其结果

    Promise的状态改变

      成功:pending变为resolved,失败:pending变为rejected

      只有这两种,且一个promise对象只能改变一次

      无论成功还是失败,都会有一个结果数据

      成功的结构数据一般称为vlaue,失败的结果数据一般称为 reason

    Promise的基本流程

    new Promise( )  ->  执行异步操作

      ①成功:执行 resolve()  ->  Promise对象(resolved状态)->  回调 onResolved( )    then()         新的Promise对象

      ②失败:执行reject( )  ->  Promise对象(rejected状态)  -> 回调onRejected     then() / catch()       新的Promise对象

     //1,创建一个新的promise对象
        const p = new Promise((resolve,reject)=>{ //执行器函数是同步回调!
            console.log('执行excutor'); //立刻执行
            //2,执行异步操作
            setTimeout(()=>{
                const time = Date.now()
                if(time%2===0){
                    resolve('成功的数据,time='+time); //3.1 如果成功了, 调用 resolve(value)
                }
                else{
                    reject('失败的数据,time='+time); //3.2 如果失败了, 调用 reject(reason)
                }
            },1000)
            console.log('123'); //先输出执行 excutor
        })
    
        p.then(
            value=>{ //接收成功得到的value  onResolved(当成功的时候)
                console.log('成功的回调:',value)
            },
            reason=>{ //接收失败得到的reason   onRejected
                console.log('失败的回调:',reason)
            }
        )
    
        p.catch(
            reason=>{
                console.log('p.catch:',reason); // 接收得到失败的reason数据  onRejected 回调执行
            }
        )
    
        //执行excutor
        //123
        //成功的回调: 成功的数据,time=1590557706934 / 失败的回调: 失败的数据,time=1590557756329
    

     

    为什么使用Promise?

    对比不同回调方式:

    1,指定回调函数的方式更加灵活(可以指定什么时候调用回调函数)

      ①纯回调,必须在启动异步任务前指定

        如:启动任务(audioSetting)前必须指定回调函数(callback)

          createAudioFileAsync( audioSetting , successCallback , failCallback )

      ②promise:启动异步任务=》返回promise对象=》给promise 对象绑定回调函数(甚至可以在异步任务结束后指定)

        如:可在启动任务(audioSetting)后指定回调函数(callback)

          const promise = createAudioFileAsync( audioSetting )

          setTimeout( () => {

            promise.then( successCallback , failCallback )

          } , 1000 )

    2,支持链式调用,可以解决回调地狱问题

      回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件( 不便于阅读 , 不便于异常处理 )

          

      解决方案:promise链式调用

          

      终极解决方案:async / await

          

        //1,查出当前用户信息
        //2,按照当前用户的id查出它的课程
        //3,按照当前课程id查出分数
    
        //回调地狱
        $.ajax({
            url:'./mock/user.json',
            success(data){
                console.log("用户信息:",data)
                $.ajax({
                    url:`./mock/user_course_${data.id}.json`,
                    success(data){
                        console.log("当前用户课程:",data);
                        $.ajax({
                            url:`./mock/course_score_${data.id}.json`,
                            success(data){
                                console.log("当前用户当前课程的分数:",data);
                            },
                            error(error){
                                console.log("查询当前用户当前课程分数异常:",error);
                            }
                        })
                    },
                    error(error){
                        console.log("查询当前用户课程异常:",error)
                    }
                })
            },
            error(error){
                console.log("查询用户信息异常:",error)
            }
        })
    
        //promise调用方式
        function get(url,data){
            return new Promise((resolve,reject)=>{
                $.ajax({
                    url:url,
                    data:data,
                    success:function(data){
                        resolve(data)
                    },
                    error:function(err){
                        reject(err)
                    }
                })
            })
        }
    
        //调用封装后的方法
        get("./mock/user.json")
        .then((data)=>{
            console.log("查询用户信息成功:",data);
            return get(`./mock/user_course_${data.id}.json`)
        })
        .then((data)=>{
            console.log("查询当前用户当前课程成功:",data)
            return get(`./mock/course_score_${data.id}.json`)
        })
        .then((data)=>{
            console.log("查询当前用户当前课程分数成功:",data)
        })
        .catch((err)=>{
            console.log("出现异常:",err)
        })
    

      

      

  • 相关阅读:
    DataTable用中使用Compute 实现简单的DataTable数据的统计
    绑定生成一个有树结构的下拉菜单
    Docker--UI管理-----------Portainer安装部署使用
    调整系统的inode数量
    配置Linux服务器从第三方 SMTP 服务器外发邮件
    Jenkins的用户角色权限管理
    shell脚本----MongoDB4.0.21一键安装
    Shell----监控CPU/内存/负载高时的进程
    MySQL配置参数优化
    shell脚本实现---Zabbix5.0快速部署
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12972686.html
Copyright © 2011-2022 走看看