基于Promise封装Ajax请求

面试官经常会让手写一个promise封装,直接写出一个请求分装即可,最具代表性

 function ajaxMise(url, method, data, async) {
            var xhr = new XMLHttpRequest()   //创建XMLHttpRequest异步对象
            return new Promise((resolve, reject) => {
                // @request: GET 
                // sendAdress: 请求地址
                // async :是否需要异步操作

                
                //设置超时时间
                xhr.timeout = options.timeout;
                // 根据状态信息和状态码进行识别
                xhr.onreadstatechange = () => {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        let result = xhr.responseText
                        resolve(result)
                    }
                }
  

                // get请求
                if(method === 'GET'){
                    xhr.open(method,url,async)
                    xhr.send(null)
                }
                
               //post请求
                if(method === 'POST'){
                    xhr.open(method,url,async)
                    xhr.setRequestHeader("Content-type","app/json")
                    xhr.send(data)
                }


                //错误处理  request 被停止时触发 
                xhr.onabort = () => {
                    reject(new Error({
                        errorType: 'about_error',
                        xhr: xhr
                    }))
                }
                //超过请求时间触发
                xhr.ontimeout = () => {
                    reject({
                        errorType: 'onerror',
                        xhr: xhr
                    })
                }

                // request错误时触发
                xhr.onerror = () => {
                    reject({
                        errorType: "onerror",
                        xhr: xhr
                    })
                }

            })
        }

 额外问题1:为什么要封装Ajax,难道不封装就不能用吗?

$.ajax({
 type:"POST",
 url:"",
 data:{},
 dataType:"json",
 success:function (data) {
 console.log(data);
 },
 error:function (err) {
 console.log(err);
 }
})

大佬: 能用,以上代码有点臃肿,不易维护,如果请求地址是同一个,请求方式不同,我们每次都写一遍,大大增加了劳动力,缩短了在世界存活的时间

额外问题2:为什么要选择Promise进行封装呢? 难道函数封装做不到吗?

function ajax(url,data,type,callback){
 $.ajax({
 type:type,
 url:url,
 data:data,
 dataType:"json",
 success:function (data) {
 callback(data);
 }
 })
}
let url="";
let data={}
function callback(data){
 console.log(data)
}

大佬:当然可以,以上代码看起来已经客服了代码臃肿,重复的弊端,但是还有一个弊端就是如果有多个回调函数处理时,就陷入了一种回调地狱的状态

利用上述的Promise,问题就得到了最好的解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值