zoukankan      html  css  js  c++  java
  • 实现简易axios

    实现简易axios

        /* 
        1.函数的返回值为promise, 成功的结果为response, 失败的结果为error
        2.能处理多种类型的请求: GET/POST/PUT/DELETE
        3.函数的参数为一个配置对象
          {
            url: '',   // 请求地址
            method: '',   // 请求方式GET/POST/PUT/DELETE
            params: {},  // GET/DELETE请求的query参数
            data: {}, // POST或DELETE请求的请求体参数 
          }
        4.响应json数据自动解析为js的对象/数组
        */
        function axios({
          url,
          method='GET',
          params={},
          data={}
        }) {
          // 返回一个promise对象
          return new Promise((resolve, reject) => {
    
            // 处理method(转大写)
            method = method.toUpperCase()
    
            // 处理query参数(拼接到url上)   id=1&xxx=abc
            /* 
            {
              id: 1,
              xxx: 'abc'
            }
            */
            let queryString = ''
            Object.keys(params).forEach(key => {
              queryString += `${key}=${params[key]}&`
            })
            if (queryString) { // id=1&xxx=abc&
              // 去除最后的&
              queryString = queryString.substring(0, queryString.length-1)
              // 接到url
              url += '?' + queryString
            }
    
    
            // 1. 执行异步ajax请求
            // 创建xhr对象
            const request = new XMLHttpRequest()
            // 打开连接(初始化请求, 没有请求)
            request.open(method, url, true)
    
            // 发送请求
            if (method==='GET' || method==='DELETE') {
              request.send()
            } else if (method==='POST' || method==='PUT'){
              request.setRequestHeader('Content-Type', 'application/json;charset=utf-8') // 告诉服务器请求体的格式是json
              request.send(JSON.stringify(data)) // 发送json格式请求体参数
            }
    
            // 绑定状态改变的监听
            request.onreadystatechange = function () {
              // 如果请求没有完成, 直接结束
              if (request.readyState!==4) {
                return
              }
              // 如果响应状态码在[200, 300)之间代表成功, 否则失败
              const {status, statusText} = request
              // 2.1. 如果请求成功了, 调用resolve()
              if (status>=200 && status<=299) {
                // 准备结果数据对象response
                const response = {
                  data: JSON.parse(request.response),
                  status,
                  statusText
                }
                resolve(response)
              } else { // 2.2. 如果请求失败了, 调用reject()
                reject(new Error('request error status is ' + status))
              }
            }
          })
        }
  • 相关阅读:
    持续交付知易行难,想做成这事你要理解这几个关键点
    运维需要懂产品和运营吗?
    云计算和AI时代,运维应该如何做好转型?
    从谷歌CRE谈起,运维如何培养服务意识?
    谷歌SRE运维模式解读
    如何打造好运维组织架构?
    如何在CMDB中落地应用的概念?
    有了CMDB,为什么还需要应用配置管理?
    Vue视图渲染原理解析,从构建VNode到生成真实节点树
    10个Vue开发技巧助力成为更好的工程师(二)
  • 原文地址:https://www.cnblogs.com/zzxuan/p/9426870.html
Copyright © 2011-2022 走看看