学静思语
Published on 2025-02-15 / 2 Visits
0
0

Promise对象的使用

Promise对象的使用

一、Promise基本介绍

  • 传统的Ajax异步请求调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的Callback Hell
  • 为了解决上述的问题,Promise对象应运而生,在EMCAScript 2015 当中已经成为标准
  • Promise是异步编程的一种解决方案
  • 从语法上说,Promise是一个对象,从它可以获取异步请求操作的消息

二、注意事项和使用细节

  • 如果返回的是Promise对象,可以继续执行.then()
  • .then((data)=>{})的data数据是上一次正确执行后resolve(data)返回传入的
  • 通过多级.then()可以对异步请求分层次请求,实现代码重排,代码逻辑更加清晰合理
  • 通过多级.then()后面的.catch((err)=>{})可捕获发生异常,便于调试

三、Ajax原生请求方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax异步请求</title>
</head>
<script type="text/javascript" src="script/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
    $.ajax({
        url:"data/monster.json",
        success(returnData){
            console.log("第一次ajax请求=>",returnData)
        //     再次发出ajax请求
            $.ajax({
                url:`data/monster_id_${returnData.id}.json`,
                success(returnData) {
                    console.log("第二次ajax请求=>",returnData)
                //    再次发出ajax请求
                    $.ajax({
                        url:`data/monster_gf_${returnData.gfid}.json`,
                        success(returnData){
                            console.log("第三次ajax请求=>",returnData)
                        },
                        error(error){
                            console.log("请求失败=>",error)
                        }
                    })
                },
                error(error) {
                    console.log("请求失败=>",error)
                }
            })

        },
        error(error){
            console.log("请求失败=>",error)
        }
    })
</script>
<body>

</body>
</html>

四、Promise实现异步请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise请求</title>
</head>
<script type="text/javascript" src="script/jquery-3.7.1.min.js"></script>

<script type="text/javascript">

    // 1.使用promise来实现Ajax请求
    let promise = new Promise((resolve, reject) => {
        //仍然使用Ajax方式进行请求
        $.ajax({
            url: "data/monster.json",
            success(returnData) {
                console.log("第一次Ajax请求=>", returnData)
                //     成功后调用resolve函数
                resolve(returnData);
            },
            error(error) {
                console.log("请求失败=>", error)
            }
        })

    });

    promise.then((returnDate) => {
        // 为了还能再次进行Ajax请求,需要创建promise对象然后再返回
        return new Promise((resolve, reject) => {
            //再次使用Ajax请求
            $.ajax({
                url: `data/monster_id_${returnDate.id}.json`,
                success(returnData) {
                    console.log("第二次请求=>", returnData)
                    resolve(returnData)
                },
                error(error) {
                    console.log("请求失败=>", error)
                }
            })
        });

    }).then((returnDate)=>{
        // 为了还能再次进行Ajax请求,需要创建promise对象然后再返回
        return new Promise((resolve, reject) => {
            //再次使用Ajax请求
            $.ajax({
                url: `data/monster_gf_${returnDate.gfid}.json`,
                success(returnData) {
                    console.log("第三次请求=>", returnData)
                    resolve(returnData)
                },
                error(error) {
                    console.log("请求失败=>", error)
                }
            })
        });
    })

</script>
<body>

</body>
</html>

五、Promise代码重排

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise代码重排</title>
</head>
<script type="text/javascript" src="script/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
    //将所有重复的代码提取出来
    // 传入url和data
    // url 请求路径
    // data 携带的数据
    function get(url,data){
        // 返回promise对象
        return new Promise((resolve,reject)=>{
            //使用Ajax请求
            $.ajax({
                url:url,
                data:data,
                success(returnData){
                    // 成功以后以后调用resolve函数
                    resolve(returnData);
                },
                error(error){
                    //失败后调用reject函数
                    reject(error);
                }
            })
        });
    }

//     请求数据
    get("data/monster.json").then((returnData)=>{
    //     打印信息,然后发出第二次请求
        console.log("第一次请求:==>",returnData);
        return get(`data/monster_id_${returnData.id}.json`);

    }).then((returnData)=>{
        //     打印信息,然后发出第三次请求
        console.log("第二次请求:==>",returnData);
        return get(`data/monster_gf_${returnData.gfid}.json`);
    }).then((returnData)=>{
        //     打印信息,然后发出第四次请求
        console.log("第三次请求:==>",returnData);
    }).catch((error)=>{
        // 可以捕获异常
        console.log("发生的异常是:=>",error);
    })


</script>
<body>

</body>
</html>

Comment