面试官经常会让手写一个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,问题就得到了最好的解决!