Q1:使用XMLHttpRequest
来封装 AJAX,同时使用 Promise 进行封装:
function getJSON(url) {
return new Promise((resolve, reject) => {
// 1.创建 xhr 实例
const xhr = new XMLHttpRequest();
// 2.注册相关事件回调函数
xhr.onreadystatechange = function() {
if(xhr.readyState !== 4) return
if(xhr.status === 200 || xhr.status === 304) {
resolve(xhr.responseText)
} else {
reject(new Error(xhr.responseText))
}
/*
switch(xhr.readyState) {
case 0:
console.log("请求未初始化");
break;
case 1:
console.log("OPENED");
break;
case 2:
console.log("HEADERS_RECEIVED");
break;
case 3:
console.log("LOADING");
break;
case 4:
if(xhr.status === 200 || xhr.status === 304) {
resolve(xhr.responseText)
}
console.log("DONE")
break;
default:
reject(new Error(xhr.responseText))
}
*/
}
xhr.ontimeout = function(){} // 超时执行的回调函数
xhr.onerror = function(){} // 网络请求出错执行的回调函数
// 3.打开请求
xhr.open("GET", url, true) // 创建一个 GET 请求,采用异步
// 4.配置参数
xhr.timeout = 3000
xhr.setRequestHeader("Content-Type": "application/json")
// 5.发送请求
xhr.send()
})
}