使用promise简单封装ajax请求

关键代码

相关封装代码
// 使用Promise封装ajax请求
getStreetsPromise(obj) {
    // 相关所传的参数
    let data = obj.data
    // 请求的接口
    let url = obj.url
    // 不传默认发送get请求
    let methed = obj.methed || 'get'
    // 默认以表单形式进行发送
    let headers = obj.headers || 'formdata'
    // 定义query变量存储的query字符串,主要用于get请求
    let query = ''
    if(data) {
        for(let i in data) {
            query += i + '=' + data[i] + '&'
        }
        // 去除掉后面的'&'
        query = query.slice(0, -1)
    }
    // 下面就是原生ajax写法
    let xhr = null
    // 使用能力检测
    if(window.XMLHttpRequest) {
        xhr = new XMLHttpRequest()
    } else if(window.ActiveXObject) {
        xhr = new ActiveXObject('Microsoft.XMLHttp')
    } else {
        throw new Error('你的浏览器不支持ajax,请升级')
    }
    // 最后返回一个promise对象
    return new Promise((resolve, reject) => {
        // 调用open,用了个三元表达式,如果methed是post请求就用url,否则用url和query字符串拼接
        /*
        * XMLHttpRequest对象的open()方法可以建立一个HTTP请求
        * 用法:xhr.open(method, url, async, username, password)
        * 其中xhr表示XMLHttpRequest对象,open()方法包含5个参数,说明如下:
        * method: HTTP请求方法,必选参数,值包括POST,GET和HEAD,大小写不敏感
        * url:请求的URL字符串,必选参数,大部分浏览器仅支持同源请求
        * async:指定请求是否为异步方式,默认为true。如果为false,当状态改变时会立即调用onreadystatechange属性指定的回调函数
        * username:可选参数,如果服务器需要验证,该参数指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口
        * password: 可选参数,验证信息中的密码部分,如果用户名为空,则该值将被忽略
        */
        xhr.open(methed, methed === 'post' ? url : url + '?' + query, true)
        // 监听事件
        xhr.onreadystatechange = function() {
            // 判断xhr的状态码
            if(xhr.readyState === 4) {
                // 成功时,接受返回的内容
                if(xhr.status === 200) {
                    resolve(JSON.parse(xhr.responseText))
                } else {
                    // 失败时,接受返回的内容
                    reject(xhr.responseText)
                }
            }
        }
        // 设置响应头模拟为表单数据,如果传进入的是json,请求头类型就设置json,发送json字符串
        // 如果传进去的是formdata,请求头类型就设置formdata,发送query字符串
        if(headers.toLowerCase() === 'json') {
            xhr.setRequestHeader('contentType', 'application/json; charset=utf-8')
            xhr.send(JSON.stringify(data))
        } else if(headers.toLowerCase() === 'formdata') {
            xhr.setRequestHeader('contentType', 'application/x-www-form-urlencoded; charset=utf-8')
            xhr.send(query)
        }
    })
},

使用ajax请求进行调用

this.getStreetsPromise({
    url: '接口名称',
    methed: '请求方式',
    data: '发送的请求数据',
    headers: 'json'
}).then(data => {
    console.log('成功', data)
}).catch(err => {
    console.log('失败', err)
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值