10.24 Ajax day05 封装原生Ajax&async await

本文详细介绍了如何封装原生Ajax过程,包括设置参数、返回Promise对象、创建xhr对象并进行请求操作。同时,探讨了async和await的使用,强调它们在解决异步问题,尤其是回调地狱方面的优势。通过async函数,可以使得代码更易读,await后的Promise对象控制异步流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.封装过程

               创建函数 设置参数

                return Promise对象(四个参数)

                输出Promise 四参数

                创建xhr对象   

                    调用xhr.open()

                     调用xhr.send([请求体数据])  判断get 

                      监听load事件

 //  GET   http://www.liulongbin.top:3009/api/get
    //  POST  http://www.liulongbin.top:3009/api/post

    // 发送get请求
    function myaxios({method='get',url,params,data}){
        return new Promise((resolve,reject)=>{
         console.log(method,url,params,data) 
        //  发送请求,创建xhr
          let xhr=new XMLHttpRequest()
             
          // 把查询参数写到地址中
            if(params){
              let arr=[]
              for (let k in params){
                arr.push(`${k}=${params[k]}`)
                
                // let str=arr.join('&')
                // xhr.open(method,`${url}?${str}`)
              }
              url+=`?${arr.join('&')}`
            }
              xhr.open(method,url)
            
           
            // xhr.setRequestHeader(content-Type,)
            if(method.toLowerCase==="get"){
              xhr.send()
            }else{
              xhr.setRequestHeader('content-Type','application/json')
              xhr.send(JSON.stringify(data))
              // xhr.send(data)
            }
            
            xhr.addEventListener('load',function(){
              resolve(JSON.parse(xhr.response))//改成成功状态,执行then
            })
            // 监听error 处理请求失败
            xhr.addEventListener('error',function(){
              reject("网络异常,请求失败")
            })
        })
      }

   // 发送get请求
   document.querySelector('#btnGet').addEventListener('click', function () {
      // 使用自己封装的ajax函数来发送请求
      myaxios({
        method:'get',
        url:'http://www.liulongbin.top:3009/api/get',
        params:{
          name:'lw',
          age:10
        }
      }).then((res)=>{
        console.log(res)})
    })

    // 发送post请求
    document.querySelector('#btnPost').addEventListener('click', function () {
      // 使用自己封装的ajax函数来发送请求
      myaxios({
        method:'post',
        url:'http://www.liulongbin.top:3009/api/post',
        params:{
          name:'lw',
          age:10
        },
        data:{
          name:'niuma'
        }
      }).then((res)=>{
        console.log(res)})
        .catch((err)=>{alert(err)})

    })

    


        二

1.async&await

        用于修饰函数是异步的

        如果async没有await,那么async没有意义,全是同步的内容

        只有遇到了await开始往下,才是异步的开始

  async   function fn() {
            let num = await 1
            console.log(num)
        }
        fn()
        console.log(2)

        //2 1

        await后面一般跟promise对象

 let {data:res}=await axios.get('http://www.liulongbin.top:3006/api/getbooks')
            console.log(res)
  async function fn(){
            try{
            let {data:res}=await axios.get('http://www.liulongbin.top:3006/api/getbooks')
            console.log(res)
            }catch(e){
                console.log(e)
                alert('获取失败,请稍后重试')
            }
        
        }
        fn()

        使用async和await解决回调地狱的问题

 // 使用async await 解决回调地狱问题
        function fn(color, time) {
            // color 就是成功的结果
            // time  延时时间

            // 记得将创建的promise实例对象给返回出去
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    resolve(color) // 状态 fulfilled 成功
                }, time)
            })
        }
        async function demo(){
                let color1=await fn('red',2000)
                console.log(color1)
                let color2=await fn('yellow',1000)
                console.log(color2)
                let color3=await fn('green',3000)
                console.log(color3)
            }
            demo()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值