前端学习笔记-AJAX

首字母略缩词AJAX,全名Asynchronous Javascript And XML
卖点当然是第一个词:Asynchronous,即异步;
而最后一个词是XML,当然要谈到XMLHttpRequest这个对象,是发起AJAX的核心;

MDN:通过交互式网站和现代 Web 标准,AJAX正在逐渐被 JavaScript 框架中的函数和官方的 Fetch API 标准取代。

流程5点

先参考一下 HTTP 请求:

  1. 设置目标网址、请求方法(get/post)。
  2. 提交请求的数据、请求主体。
  3. 接收响应回来的内容。

发送 Ajax 请求的5点:

  1. 创建xhr对象,即 new 一个 XMLHttpRequest()
  2. 调用open(method, url, async=true)设置请求参数:请求方法、目标url、是否异步。async默认 true。
  3. 调用send()发送请求:
  4. 定义事件回调:onreadystatechange = callback(),状态改变时就会调用。
  5. 服务端响应,在回调函数中获取返回的数据。

看看一般情况下GET的代码即可,正好5步骤对应5行

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api', true);
xhr.send(null);
xhr.onreadystatechange = function () { 
	/* 可拿到xhr.responseText 或 xhr.responseXML*/
};

如果使用POST方法,就需要在send之前调用 xhr对象的 setRequestHeader() 来添加header。然后给 send()传入要发送的数据:

xhr.open('POST', '/api', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('name=LXY&son=MR');

xhr.readyState,表达的是request的状态:

从0~4共有5个:

state状态助记
0unsent未初始化open()没被调用,请求还未初始化
1opened正在加载open()被调用,已建立服务器链接
2headers_received加载成功send()被调用,请求已接受
3loading交互正在处理请求,下载中
4done完成请求已完成 并且响应已准备好

直接看示例代码:

var xhr = new XMLHttpRequest();
console.log('UNSENT', xhr.readyState); // readyState will be 0

xhr.open('GET', '/api', true);
console.log('OPENED', xhr.readyState); // readyState will be 1

xhr.onprogress = function () {
    console.log('LOADING', xhr.readyState); // readyState will be 3
};

xhr.onload = function () {
    console.log('DONE', xhr.readyState); // readyState will be 4
};

xhr.send(null);

呃,看起来很难在状态2 也就是headers_received的瞬间做什么事情……

但这段代码提醒我们,还有两个事件可以注册回调:onprogressonload ,顾名思义吧。

xhr.status,表达的是response的状态

它的默认值取0 (完成前 或 出错后),正常情况返回的是HTTP status codes (比如200、404那些)。

综上,当 readyState 等于 4 且状态码为 200 时,可判断请求响应的过程成功结束。

两个属性各自表示不同的状态,不要弄混,示例代码:

xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log('收到:' + JSON.stringify(xhr.responseText));
        // 后续操作:document.querySelector('h1').innerHTML = xhr.responseText;
    }
};

封装

function myAjax(url, callback, failback) {
    // 1、创建XHR对象 new
    const xhr = new XMLHttpRequest();
    // 2、发送请求 open & send
    xhr.open('GET', url, true);
    xhr.send();
    // 3、服务端响应 readyState & status 
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            const obj = JSON.parse(xhr.responseText);
            console.log('返回数据:', obj);
            callback && callback(xhr.responseText);
        } else {
            failback && failback(new Error('请求失败'));
        }
    };
}

// 单次调用
myAjax('a.json', (res) => { console.log(res); });

// 多次调用,给大家表演一个回调地狱
myAjax('a.json', (resA) => {
    console.log(resA);
    myAjax('b.json', (resB) => {
        console.log(resB);
        myAjax('c.json', (resC) => {
            console.log(resC);
        });
    });
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值