个人主页:前端青山
系列专栏:JavaScript篇
人终将被年少不可得之物困其一生
依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-AjAx
目录
AJAX
AJAX 的优势
AJAX 的使用
创建一个 ajax 对象
配置链接信息
发送请求
一个基本的 ajax 请求
ajax 状态码
readyStateChange
responseText
ajax的工作原理
使用 ajax 发送请求时携带参数
发送一个带有参数的 get 请求
发送一个带有参数的 post 请求
get与post的区别?
get
post
封装 AJAX
确定一下使用的方式
Promise
什么是Promise?
promise使用语法
Promise原型对象的方法
处理多个异步
Promise的静态方法
Promise中的三种状态
ASYNC/AWAIT
async 和 await 关键字
async 关键字的用法
await 关键字的用法
缺点
解决方案
ajax
全名 async javascript and XML
是前后台交互的能力
也就是我们客户端给服务端发送消息的工具,以及接受响应的工具
是一个 默认异步 执行机制的功能
XML与JSON:都是可以跨平台、跨语言的一种数据格式。
JSON的格式:
通过异步与服务器通信,将用户请求的数据通过回调函数返回,并利用javascript将数据动态的添加到页面中,且整个过程不需要重新加载整个页面就可以完成
// 除IE6所有浏览器都支持的
const xhr = new XMLHttpRequest()
// IE6
const xhr = new ActiveXObject('Mricosoft.XMLHTTP')
xhr
对象来发送 ajax 请求了const xhr = new XMLHttpRequest()
// xhr 对象中的 open 方法是来配置请求信息的
// 第一个参数是本次请求的请求方式 get / post / put / ...
// 第二个参数是本次请求的 url
// 第三个参数是本次请求是否异步,默认 true 表示异步,false 表示同步
// xhr.open('请求方式', '请求地址', 是否异步)
xhr.open('get', './data.php')
const xhr = new XMLHttpRequest()
xhr.open('get', './data.php')
// 使用 xhr 对象中的 send 方法来发送请求
xhr.send()
xhr.readyState
readyState === 0
: 表示未初始化完成,也就是 open
方法还没有执行readyState === 1
: 表示配置信息已经完成,也就是执行完 open
之后readyState === 2
: 表示 send
方法已经执行完成readyState === 3
: 表示正在解析响应内容readyState === 4
: 表示响应内容已经解析完毕,可以在客户端使用了readyState === 4
的时候,我们才可以正常使用服务端给我们的数据xhr.status
在 ajax 对象中有一个事件,叫做 readyStateChange
事件
这个事件是专门用来监听 ajax 对象的 readyState
值改变的的行为
也就是说只要 readyState
的值发生变化了,那么就会触发该事件
所以我们就在这个事件中来监听 ajax 的 readyState
是不是到 4 了
const xhr = new XMLHttpRequest()
xhr.open('get', './data.php')
xhr.send()
xhr.onreadyStateChange = function () {
// 每次 readyState 改变的时候都会触发该事件
// 我们就在这里判断 readyState 的值是不是到 4
// 并且 http 的状态码是不是 200 ~ 299
if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
// 这里表示验证通过
// 我们就可以获取服务端给我们响应的内容了
}
}
ajax 对象中的 responseText
成员
就是用来记录服务端给我们的响应体内容的
所以我们就用这个成员来获取响应体内容就可以
const xhr = new XMLHttpRequest()
xhr.open('get', './data.php')
xhr.send()
xhr.onreadyStateChange = function () {
if (xhr.readyState === 4 && /^2\d{2|$/.test(xhr.status)) {
// 我们在这里直接打印 xhr.responseText 来查看服务端给我们返回的内容
console.log(xhr.responseText)
}
}
前后端交互,首先需要创建一个XMLHttpRequest对象,通过这个对象的open方法与服务器建立连接,通过send方法将请求发送给服务器,最后通过事件监听,将后端请求的数据通过回调函数返回给前端。
get 请求的参数就直接在 url 后面进行拼接就可以
const xhr = new XMLHttpRequest()
// 直接在地址后面加一个 ?,然后以 key=value 的形式传递
// 两个数据之间以 & 分割
xhr.open('get', './data.php?a=100&b=200')
xhr.send()
post 请求的参数是携带在请求体中的,所以不需要再 url 后面拼接
const xhr = new XMLHttpRequest()
xhr.open('get', './data.php')
// 如果是用 ajax 对象发送 post 请求,必须要先设置一下请求头中的 content-type
// 告诉一下服务端我给你的是一个什么样子的数据格式
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
// 请求体直接再 send 的时候写在 () 里面就行
// 不需要问号,直接就是 'key=value&key=value' 的形式
xhr.send('a=100&b=200')
application/x-www-form-urlencoded
表示的数据格式就是 key=value&key=value
传递速度慢
传递数据大小为 2MB
参数在http协议的请求体中传递
post传递参数相对安全。
不会留下历史记录
因为有一些内容可以不传递,我们可以使用默认值,所以选择对象传递参数的方式
// 使用的时候直接调用,传递一个对象就可以
ajax({
url: '', // 请求的地址
type: '', // 请求方式
async: '', // 是否异步
data: '', // 携带的参数
dataType: '', // 要不要执行 json.parse
success: function () {} // 成功以后执行的函数
})
ES6提出的异步编程解决方案.
承诺的意思,是一个专门用来解决异步 回调地狱 的问题
// 检测机构
//resolve : 处理异步时成功的状态
//reject : 处理异步时失败的状态
new Promise((resolve,reject) => {
if(处理异步){
resolve([参数]);
}else{
reject([参数]);
}
})
new Promise((resolve,reject) => {
if(处理异步){
resolve([参数]);
}else{
reject([参数]);
}
})
.then(() => {
return new Promise(() => {
})
})
.then(() => {
return new Promise(() => {
})
})
……
.then(() => {
})
Promise.all() 将调用所有的promse对象,全部返回resolve时,该对象才返回resolve。如果有一个promise返回reject时,该对象返回reject
这个时候,我们的代码已经改观了很多了
基本已经可以维护了
但是对于一个程序员来说,这个样子是不够的
我们还需要更加的简化代码
所以我们就需要用到一个 es7 的语法了
叫做 async/await
async/await
是一个 es7 的语法
这个语法是 回调地狱的终极解决方案
语法:
async function fn() {
const res = await promise对象
}