【javaScript】Ajax封装之原生js的xmlHttpRequest的封装,支持传入成功失败的回调方法,也支持使用promise的then和catch。支持get和post请求

方法封装

/**
* 描述: ajax请求封装
* @param {String} url 请求地址
* @param {String} method 请求方式
* @param {Object} params get请求的参数
* @param {Object} data post请求的参数
* @param {Function} success 成功的回调
* @param {Function} error 失败的回调
*/
const request = ({ url = '', method = 'get', params = {}, data = {}, success, error }) => {
	return new Promise((resolve, reject) => {
		// 创建ajax
		let xhr
		if (window.XMLHttpRequest) xhr = new XMLHttpRequest()	//判断XMLHttpRequest是否存在
		else xhr = new ActiveXObject('MicroSoft.XMLHTTP')	//兼容老版本ie

		// 监听请求完成
		xhr.onreadystatechange = function () {
			// 固定写法 readyState 表示 ajax的状态 
			//ajax的状态总共有(0 1 2 3 4 )五种状态 状态为4表示请求完成 status === 200表示成功
			if (xhr.readyState == 4) { //请求完成
				if(xhr.status === 200) {	//http请求状态为200 成功
					let res = xhr.responseText;  //接收响应结果 结果是JSON字符串
					// 转化为对象 传给成功的回调
					success && success(JSON.parse(res)) //成功的回调
					resolve(JSON.parse(res)) //promise 成功 返回
				}else { //状态码不为200 失败
					error && error(xhr.status)	//失败的回调
					reject(xhr.status) //promise 失败 返回
				}
			}
		}
		// 根据请求方式发送请求
		switch (method.toUpperCase()) {
			case "GET":
				//构建请求的url
				let reqUrl = url
				if (Object.keys(params).length > 0) reqUrl += '?' + Object.keys(params).map(key => key + '=' + params[key]).join('&') //url拼接请求参数
				xhr.open('GET', reqUrl);
				xhr.send() //发送请求
				break
			case "POST":
				xhr.open('POST', url);
				xhr.setRequestHeader('Content-Type', 'application/json') //设置请求头为json
				if (Object.keys(data).length > 0) xhr.send(JSON.stringify(data))	//传入数据 发送请求
				else xhr.send()	//无参请求
				break
		}
	})
}

使用案例

const BASE_URL = 'http://localhost:8080'

/** post请求 promise用法 */
request({
	url: BASE_URL + '/mes/list', //url
	method: 'post',	//请求方式
	data: { a: 1, b: { c: 3 } }, //post请求的参数
}).then(res => { //http成功
	console.log(res, 'post promise用法 res');
}).catch(errCode => { //http失败
	console.log(errCode, 'post promise用法 errCode')
})

/** get请求 promise用法 */
request({
	url: BASE_URL + '/mes/list', //url
	method: 'get', //请求方式
	params: { a: 1, b: 2 }, //get请求的参数
}).then(res => { //http成功
	console.log(res, 'get promise用法 res');
}).catch(errCode => { //http失败
	console.log(errCode, 'get promise用法 errCode')
})

/** get请求 回调用法 */
request({
	url: BASE_URL + '/mes/list', //url
	method: 'get', //请求方式
	params: { a: 1, b: 2 },	//参数
	success: (res) => {
		console.log(res, 'get请求 回调用法 成功res')
	},
	error: (errCode) => {
		console.log(errCode, 'get请求 回调用法 失败errCode')
	}
})

/** post请求 回调用法 */
request({
	url: BASE_URL + '/mes/list', //url
	method: 'post', //请求方式
	data: { a: 1, b: 2 }, //参数
	success: (res) => {
		console.log(res, 'post请求 回调用法 成功res')
	},
	error: (errCode) => {
		console.log(errCode, 'post请求 回调用法 失败errCode')
	}
})
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孑然R

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值