title: 原生JS封裝jQuery的AJAX
date: 2018-10-08 11:04:15
tags: [JavaScript]
categories: JavaScript
基本功能
設(shè)置請(qǐng)求request
第一步 let request = new XMLHttpRequest()
第一部分:
request.open('GET', '/xxx')
第二部分:(不能設(shè)置User-Agent,會(huì)報(bào)錯(cuò))
request.setRequestHeader('Content-Type', 'x-www-form-urlencoded')
第四部分:
request.send('a=0&b=1')
獲取響應(yīng)response
第一部分:獲取HTTP狀態(tài)
request.status //200
request.statusText //OK
第二部分:獲取響應(yīng)header
request.getAllResponseHeaders() //獲取第二部分所有內(nèi)容
request.getResponseHeader('Content-Type') //獲取Content-Type 的內(nèi)容
第四部分:
request.responseText()
封裝jQuery.ajax
初始版本
封裝:
window.jQuery.ajax = function(options){
let url = options.url
let method = options.method
let body = options.body
let successFn = options.successFn
let failFn = options.failFn
let headers = options.headers
let request = new XMLHttpRequest()
request.open(method, url) //初始化請(qǐng)求
for(let key in headers){
let value = headers[key]
request.setRequestHeader(key, value)
}
request.onreadystatechange = () =>{
if(request.readyState === 4){
if(request.status >= 200 && request.status <= 300){
successFn.call(undefined, request.responseText)
}else if(request.status >= 400){
failFn.call(undefined, request)
}
}
}
request.send(body) //發(fā)送請(qǐng)求
}
window.$ = window.jQuery
調(diào)用:
myButton.addEventListener('click', (e) =>{
window.jQuery.ajax({
url: '/xxx',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'allen': '23'
} ,
body: 'a=0&b=1',
successFn: (x) => {console.log(x)},
failFn: (x) => {
console.log(x)
console.log(x.statusText)
console.log(x.responseText) //請(qǐng)求失敗也可以獲取第四部分
}
})
})
此時(shí)代碼很傻姑原,下面來優(yōu)化一下碎紊。
使用ES6語法解構(gòu)賦值
ES6新語法之解構(gòu)賦值歇式,見MDN文檔 阔馋。
優(yōu)化后的代碼:
window.jQuery.ajax = function({url, method, body, successFn, failFn, headers}){ //解構(gòu)賦值語法
let request = new XMLHttpRequest()
request.open(method, url) //初始化請(qǐng)求
for(let key in headers){
let value = headers[key]
request.setRequestHeader(key, value)
}
request.onreadystatechange = () =>{
if(request.readyState === 4){
if(request.status >= 200 && request.status <= 300){
successFn.call(undefined, request.responseText)
}else if(request.status >= 400){
failFn.call(undefined, request)
}
}
}
request.send(body) //發(fā)送請(qǐng)求
}
使用promise優(yōu)化
因?yàn)槊總€(gè)程序員的回調(diào)名不一樣,你不看文檔根本不知道這個(gè)庫的函數(shù)名是什么,所以我們可以使用該方法不設(shè)置successFn创葡、failFn這兩個(gè)函數(shù)的函數(shù)名。
返回一個(gè)promise對(duì)象绢慢,傳入的兩個(gè)參數(shù)resolve灿渴、reject,分別代表成功時(shí)執(zhí)行的內(nèi)容和失敗時(shí)執(zhí)行的內(nèi)容胰舆。
再次優(yōu)化后的代碼:
window.jQuery.ajax = function({url, method, body, headers}){
return new Promise(function(resolve, reject){ // 這行代碼要記住
let request = new XMLHttpRequest()
request.open(method, url) //初始化請(qǐng)求
for(let key in headers){
let value = headers[key]
request.setRequestHeader(key, value)
}
request.onreadystatechange = () =>{
if(request.readyState === 4){
if(request.status >= 200 && request.status <= 300){
resolve.call(undefined, request.responseText)
}else if(request.status >= 400){
reject.call(undefined, request)
}
}
}
request.send(body) //發(fā)送請(qǐng)求
})
}
調(diào)用:
window.jQuery.ajax({
url: '/xxx',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'allen': '23'
}
}).then(
(responseText) => {
console.log(responseText);
return responseText;
},
(request) => {
console.log('error'); return 'error'
}
)
then返回也是promise對(duì)象骚露,于是就有了鏈?zhǔn)讲僮鳌?/p>
jQuery本身的ajax方法
上面是我們模仿jQuery自己封裝的ajax方法,下面來看看jQuery真正的ajax方法缚窿。
舉例:
$.ajax({
url:'/xxx',
method: 'post',
dataType:'x-www-form-urlencoded',
data:'a=0&b=1',
success:(responseText)=>{console.log(responseText)},
error:(e)=>{console.log('error')}
})
$.ajax({
url:'/xxx',
method: 'post',
dataType:'json',
data:'a=0&b=1',
}).then(
(responseText)=>{console.log(responseText)},
(e)=>{console.log('error')}
)