<script>
/*
axios只是别人封装的一个函数,内部用的是原生ajax来发的请求
那我们自己能封装一个类似于axios的库吗?
可以
分析:
axios({
url: '',
method: ''
})
结论1: 无非就是一个函数,只不过这个函数有一个参数,这个参数要求传入一个对象
axios()
.then()
.catch()
结论2: axios函数内部返回了一个promise对象,才能.then和.catch
*/
/*
config要求两个属性: url、method
*/
function myAxios (config) {
return new Promise((resolve, reject) => {
// 1. 创建ajax对象
const xhr = new XMLHttpRequest()
let { method = 'get', url, params, data } = config
// 传过来是什么请求方式就是什么
// 传过来是什么地址,就请求什么地址
// 取出参数后拼接到url上
if (params) {
url += '?'
for (const key in params) {
url += `${key}=${params[key]}&`
}
url = url.substring(0, url.length - 1)
}
xhr.open(method, url)
// 如果是post请求要设置请求头
if (method.toLowerCase() === 'post') {
xhr.setRequestHeader('Content-Type', 'application/json')
}
// 这个事件如果被调用就代表请求成功
xhr.addEventListener('load', function () {
// console.log(JSON.parse(xhr.responseText))
// JSON.parse(xhr.responseText) 得到服务器返回的结果并成js对象
// 然后给resolve,给resolve就相当于给了外面.then里的res
resolve(JSON.parse(xhr.responseText))
})
xhr.send( JSON.stringify(data) )
})
}
// 调用这个函数就有发请求的效果
myAxios({
url: '填写你的接口地址'
}).then(res => {
console.log('then', res)
})
// 如果访问的get是携带参数的接口
myAxios({
url: '填写你的接口地址',
params: {
key: 'value'
}
}).then(res => {
console.log('then', res)
})
myAxios({
url: '填写你的接口地址',
method: 'post',
data: {
key: 'value',
key: 'value'
}
})
.then( res => {
console.log(res)
})
</script>
以上就是ajax原生的封装,大佬给点建议,谢谢