Ajax 异步编程
1. 同步异步概述
1.1 同步
- 一个人同一时间只能做一件事情, 只有一件事情做完, 才能做另外一件事
- 落实到代码中, 就是上一行代码执行完成后, 才能执行下一行代码, 即代码逐行执行
1.2 异步
- 一个人一件事情做了一半, 转而去做其他事情, 当其他事情做完以后, 再回过头继续做之前未完成的事情
- 落实到代码上, 就是异步代码虽然需要花费时间去执行, 但程序不会等待异步代码执行完成后再继续执行后续代码, 而是直接执行后续代码, 当后续代码执行完成后再回头看异步代码是否返回结果, 如果已有返回结果, 再调用事先准备好的回调函数处理异步代码执行的结果
2. Ajax 封装
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function ajax (options) {
var defaults = {
type: 'get',
url: '',
data: {},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function () {},
error: function () {}
}
Object.assign(defaults, options)
var xhr = new XMLHttpRequest()
var params = ''
for (var attr in defaults.data) {
params += attr + '=' + defaults.data[attr] + '&'
}
params = params.substr(0, params.length - 1)
if (defaults.type === 'get') {
defaults.url = defaults.url + '?' + params
}
xhr.open(defaults.type, defaults.url)
if (defaults.type === 'post') {
var contentType = defaults.header['COntent-Type']
xhr.setRequestHeader('Content-Type', defaults.header['Content-Type'])
if (contentType === 'application/json') {
xhr.send(JSON.stringify(defaults.data))
} else {
xhr.send(params)
}
} else {
xhr.send()
}
xhr.onload = function () {
const contentType = xhr.getResponseHeader('Content-Type')
var responseText = xhr.responseText
if (contentType.includes('application/json')) {
responseText = JSON.parse(responseText)
}
if (xhr.status === 200) {
defaults.success(responseText)
} else {
defaults.error(responseText, xhr)
}
}
}
ajax({
url: 'http://localhost:3000/responseData',
success: function (data) {
console.log(data)
}
})
</script>
</body>
</html>