爬取数据渲染:Promise+ XMLHttpRequest—>fetch
实现电影数据的爬取,然后将通过列表将数据渲染出来
定义一个getData函数,用于爬取数据,通过XMLHttpRequest的方法来爬取电影数据;
- 定义一个形参
url
,用于接收给定的接口地址; - 该函数返回一个
Promise对象
; - 在创建的Promise对象中,创建一个
XMLHttpRequest
对象xhr; - 配置请求,指定请求的类型为
GET
,请求的目标URL为传入接收的的url
参数,第三个参数true
表示这是一个异步请求; - 发送请求到服务器;
- 判断检查请求是否完成(readyState为4)并且服务器响应状态码为200(表示成功);
- 如果条件满足,说明成功的获取到数据,将服务器返回的文本解析成JavaScript对象,然后从中提取
movieList
属性赋值给变量moiveList; - 调用
resolve
函数,将解析后的电影列表数据miveList作为Promise的成功结果传递出去(异步操作成功完成,任何在该Promise上调用.then
方法的回调将会接收到这个数据moiveList)。
代码:
function getData(url) {
return new Promise( function(resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.send();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
let movieList = JSON.parse(xhr.responseText).movieList;
resolve(movieList);
}
}
})
}
定义一个函数renderLi用于将获取的数据通过无序列表进行渲染在页面上:
- 定义一个形参
arr
,用于接收爬取到的电影数据movieList; - 通过
forEach
遍历该数组; - 创建
li
标签; - 将
li
的innerText
设置为遍历到的数组中的元素的nm属性的值(电影名); - 将
li
加到ul
里面去,从而实现在页面上的渲染。
代码:
function renderLi(arr) {
// 创建li
arr.forEach(item => {
let li = document.createElement('li');
li.innerText = item.nm;
document.getElementById('ul').appendChild(li);
})
}
总的代码:
<!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>
<button id="btn">请求数据</button>
<ul id="ul"></ul>
<script>
function getData(url) {
return new Promise( function(resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.send();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
let movieList = JSON.parse(xhr.responseText).movieList;
resolve(movieList);
}
}
})
}
function renderLi(arr) {
// 创建li
arr.forEach(item => {
let li = document.createElement('li');
li.innerText = item.nm;
document.getElementById('ul').appendChild(li);
})
}
document.getElementById('btn').addEventListener('click', function() {
getData('https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList').then( res => {
renderLi(res);
})
})
</script>
</body>
</html>
<!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>
<button id="btn">请求数据</button>
<ul id="ul"></ul>
<script>
function renderLi(arr) {
// 创建li
arr.forEach(item => {
let li = document.createElement('li');
li.innerText = item.nm;
document.getElementById('ul').appendChild(li);
})
}
document.getElementById('btn').addEventListener('click', function() {
fetch('https://mock.mengxuegu.com/mock/65a91543c4cd67421b34c898/movie/movieList')
.then(res => {
return res.json();
})
.then(data => {
renderLi(data.movieList);
})
})
</script>
</body>
</html>
转载自:https://juejin.cn/post/7374808297184854070