手写ajax

该代码示例展示了如何使用原生JavaScript的XMLHttpRequest接口来实现GET和POST两种HTTP请求。它创建了一个名为ajax的函数,该函数接受包含URL、请求类型、数据和超时时间的选项对象。函数内部使用Promise处理异步操作,根据请求类型设置请求头并发送数据。当请求状态改变时,处理响应或错误。最后,给出了一个调用示例,发送一个GET请求到百度搜索typescript。

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

使用 原生 XMLHttpRequest简单实现两个请求方式 GET 和POST

interface IOptions{
    url:string;
    type?:"GET"|"POST";
    data:any;
    timeout?:number;
}
// {}=>url 拼接得参数
function formatUrl(object:any){
    let dataArr = []
    for(let key in object){
        dataArr.push(`${key}=${encodeURIComponent(object[key])}`)
    }
    return dataArr.join('&')
}
 const  ajax=(
    options:IOptions = {
    type:"GET",
    data:{},
    timeout:3000,
    url:'',
})=>{

return new Promise((resolve,reject)=>{
    if(!options.url) return 
  const queryString =formatUrl(options.data)
  const stateChange = ()=>{
    xhr.onreadystatechange=()=>{
        if(xhr.readyState ===4){
           clearTimeout(timer)
           if((xhr.status>=200 && xhr.status<=300)|| xhr.status === 304){
            resolve(xhr.responseText)
           }else{
            reject(xhr.status)
           }
        }
    }
  }
    let timer;
    let xhr;
     const gload = window ?window:global 

    if((global as any).XMLHttpRequest){
        xhr = new XMLHttpRequest()
    }else{
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
    }
   switch (options.type.toUpperCase()) {
    case 'GET':
        xhr.open('GET',`${options.url}?${queryString}`)
        stateChange()
        break;
    case 'POST':
        xhr.open('POST',options.url)
        xhr.setRequestHeader("ContentType",'application/x-www-form-urlencoded')
        stateChange()
        xhr.send(options.data)
        break;
    default:
        break;
   }
   if(options.timeout){
    timer  = setTimeout(()=>{
        xhr.abort()
        reject('timeout')
    },options.timeout)
   }
   
})
}
ajax({type:'GET',url:'https://www.baidu.com',data:{wd:'typescript'}}).then(res=>{
    console.log('twf',res)
})```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值