ajax、http协议、Promise

157 阅读5分钟

ajax

ajax的概念

  • AJAX (阿贾克斯 Asynchronous Javascript And Xml ) 异步JavaScript和XML
  • ajax:与服务器进行通信的一种技术,能够实现异步的刷新页面

image.png

ajax的核心

  • ajax的核心对象是XMLHttpRequest;简称xhr
  • 创建一个兼容写法的XHR对象
function createSHR(){
    if(window.XMLHttpRequest){
        // IE7+ 谷歌, 火狐, Safari等
        return new XMLHttpRequest()
    }
    // 兼容ie6
    return new ActiveXObject("Msxml2.XMLHTTP")
}

ajax步骤(5)

  1. 创建xhr核心对象

  2. 调用open方法 open(请求方式,请求路径,同步/异步)

    • 请求方式: get/post
    • 请求路径: url
    • 同步或异步: 默认是异步,true也是异步,false是同步
    • 同步: 造成阻塞,它会占据主线程
    • 异步: 开启了网络请求的线程,结合事件轮询 event loop的
  3. send() 发送请求

    • 如果是get请求,发送null,或直接不填
    • 如果post,通过send()携带参数
  4. 判断状态

    • 如果是同步,直接判断http的状态

    • 如果是异步,绑定onreadystatechange事件,结合readyState的状态码

      http的常见状态码

      状态码状态字符串说明
      200OK-成功服务器成功返回了页面
      201Created-已创建表示请求已成功,并且服务器创建了新的资源
      400Bad Request-错误请求语法错误导致服务器不识别
      401Unauthorized-未授权请求需要用户认证
      404Not found-未找到指定的URL在服务器上找不到
      500Internal Server Error服务器遇到意外错误,无法完成请求
      503ServiceUnavailable由于服务器过载或维护导致无法完成请求

      readyState的状态码

      状态说明
      0未初始化尚未调用open()方法
      1启动已经调用open()方法,但尚未调用send()方法
      2发送已经调用send()方法,但尚未接受响应
      3接受已经接收到部分响应数据
      4完成已经接收到全部响应数据
  5. 通过xhr.response获得结果

get请求

同步

// 0.创建xhr
function createXHR(){
    if(window.XMLHttpRequest){
        return new XMLHttpRequest()
    }
    return new ActiveXObject("Msxml2.XMLHTTP")
}
//封装一个ajax的get请求,同步的
function get(url){
    // 1.得到xhr
    let xhr = createXHR()  //new XMLHttpRequest()
    // 2.给xhr配置请求的相关参数
    //  open("请求参数",路径,同步/异步) true:异步;false:同步
    xhr.open("get",url,false) //同步占据主线程,造成阻塞
    // 3.发送,由于get请求是通过url带参数,send就可以不写内容或写null
    xhr.send()
    // 4.判断状态,获取结果
    if(xhr.status==200){
        // 5.通过xhr.response获取的结果
        return xhr.response
    }
}

异步并携带参数

  • get请求携带参数,在url后面添加,open()中
// 创建ajax
function createXHR() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest()
    }
    return new ActiveXObject("Msxml2.XMLHTTP")
}
// 将data数据转换为服务器能够识别的字符串  key=value&key=value& 
function Params(o){
    let str = ""
    for(let [k,v] of Object.entries(o)){
        str+=`${k}=${v}&`
    }
    return str
}
// get请求
function get(url, data = {}, callback) {
    let xhr = createXHR()
    // open第三个参数默认就是异步,true也是异步
    xhr.open("get", url + "?" + Params(data))
    // get请求,send可以为空
    xhr.send()
    // 什么时候响应数据呢?
    // 如果数据来了,就“自动”触发onreadystatechange事件,结合回调函数获取到数据
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                console.log(xhr.response);
            } else {
                consolel.log('error.状态码: ' + xhr.status + '错误信息:' + xhr.statusText);
            }
        }
    }
}

post请求

字符的编码和解码

  • 字符编码:encodeURIComponent(data)
  • 字符解码:decodeURIComponent(data)

异步post请求,携带参数

  • 注意点:
    • post请求中的参数是send()中传输
    • POST请求和Web表单提交不同, 需要使用XHR来模仿表单提交.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 创建xhr对象的方法
function createXHR() {
    return window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Msxml2.XMLHTTP")
}
// 将data数据转换为服务器能够识别的字符串  key=value&key=value& 
function Params(o){
    let str = ""
    for(let [k,v] of Object.entries(o)){
        str+=`${k}=${v}&`
    }
    return str
}
// post请求
function post(url,data,callback){
    let xhr = createXHR()
    xhr.open("post",url)
    // 采用xhr,使用ajax模仿表单提交
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    // 设置响应内容为json
    xhr.responseType="json"
    xhr.send(Params(data))
    xhr.onreadystatechange=  function(){
        if(xhr.status>=200&&xhr.status<=299&&xhr.readyState==4){
            callback&&callback(xhr.response)
        }
    }
}

HTTP协议

  • http协议是一种超文本传输协议,它是基于TCP协议的应用层传输协议,
  • 简单来说就是客户端和服务端进行数据传输的一种规则

特点

  1. 支持客户端/服务端模式
    • 即请求(request)-响应(response)模式
  2. 简单快速
    • 客户端向服务端发送请求时, 只需要传送请求方式和路径即可,所以简单,
    • 由于HTTP协议简单, 使得HTTP服务器的程序规模小, 因而速度很快;
  3. 灵活
    • 传输数据类型种类多
  4. 无连接
    • 请求一次服务器后立刻断开连接, 即非长连接 即短连接
  5. 无状态
    • HTTP协议对事务处理没有记忆能力;
    • (cookie+session)解决无状态,cookie是浏览器端的,sessionId是服务器端的

组成

  • 请求报文 + 响应报文

    请求报文

    1.请求行 [请求方式 url地址 协议(1.0/1.1/2.0) ]

    2.请求头 [content-type,cookie]

    3.请求体 [数据]

    响应报文

    1.状态行 [协议, 状态码,短语]

    2.响应头 [content-Type,...Referer:防盗链]

    3.响应体 [数据]

请求方法

  • GET, POST, HEAD, PUT等
  • 最常见的请求方法就两种是:get 和 post

Promise

promise是一个类,需要被实例化(new),微任务

Promise用来解决回调地狱的问题,有个缺点代码繁琐

Promise的状态(3个)

1.pending 等待 默认是 等待

2.fulfilled 完成

3.rejected 拒绝

【注】:这三个状态是不可逆的

Promsie的原型方法(3个)

  1. then()
    • 里面有2个函数,第1个函数取resolve的结果,第2个参数取reject的结果
  2. catch()
    • 捕获 reject的结果
  3. finally()
    • 只要执行resolve或reject后,都会执行finally

promise的静态方法 (5个)

  1. Promise.all()
    • all方法里需要填入一个数组,数组里必须都是支持promise的方法,迸发执行
  2. Promise.race()
    • race方法里需要填入一个数组,谁先完成,就只取谁的结果
  3. Promise.resolve()
    • 只执成功,并返回一个新的promise对象
  4. Promise.reject()
    • 只执失败,并返回一个新的promise对象
  5. Promise.allSettled()
    • 成功失败都会返回一个数组对象,每个对象中都会带有状态和值

ES7 async await

await关键字后面必须接promise对象,有await关键字的地方,必须是一个async 异步函数

它能解决,把异步像同步一样的被调用