适配器模式通过把一个类的接口变换成客户端所期待的另一种接口 ,可以帮我们解决不兼容的问题。
应用
js
// Ajax适配器函数,入参与旧接口保持一致
async function AjaxAdapter(type, url, data, success, failed) {
const type = type.toUpperCase()
let result
try {
// 实际的请求全部由新接口发起
if(type === 'GET') {
result = await HttpUtils.get(url) || {}
} else if(type === 'POST') {
result = await HttpUtils.post(url, data) || {}
}
// 假设请求成功对应的状态码是1
result.statusCode === 1 && success ? success(result) : failed(result.statusCode)
} catch(error) {
// 捕捉网络错误
if(failed){
failed(error.statusCode);
}
}
}
// 用适配器适配旧的Ajax方法
async function Ajax(type, url, data, success, failed) {
await AjaxAdapter(type, url, data, success, failed)
}
axios中的适配器
在axios中,适配器模式是通过adapter
函数来实现的。adapter
函数是一个高阶函数,它接受一个config
对象作为参数,并返回一个新的config
对象。
在adapter
函数中,可以对config
对象进行修改和扩展,以适应不同的环境和需求。
例如,可以在adapter
函数中添加请求拦截器和响应拦截器,以实现对请求和响应的统一处理。 同时,adapter
函数还可以根据不同的环境和需求,选择不同的适配器来处理请求。
例如,在浏览器环境中,可以使用XMLHttpRequest
适配器来发送请求;
在Node.js环境中,可以使用http
适配器来发送请求。 具体来说,axios中的适配器模式实现了以下功能:
- 请求拦截器:在发送请求之前,可以对请求进行拦截和处理。例如,可以在请求拦截器中添加请求头、修改请求参数等。
- 响应拦截器:在接收到响应之后,可以对响应进行拦截和处理。例如,可以在响应拦截器中解析响应数据、处理错误信息等。
- 适配器选择:根据不同的环境和需求,选择不同的适配器来处理请求。例如,在浏览器环境中,可以使用
XMLHttpRequest
适配器来发送请求;在Node.js环境中,可以使用http
适配器来发送请求。 - 请求发送:根据选择的适配器,发送请求并返回响应。 通过这种方式,axios可以实现对不同环境和需求的适配,同时也可以提高代码的可维护性和可扩展性。
js
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
})
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
})