在 传统Ajax 时代,进行 API 等网络请求都是经过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式很是混乱,对于刚入门的新手并不友好。今天咱们介绍的Fetch提供了一个更好的替代方法,它不只提供了一种简单,合乎逻辑的方式来跨网络异步获取资源,并且能够很容易地被其余技术使用,例如 Service Workers。git
使用Ajax请求一个 JSON 数据通常是这样:github
var xhr = new XMLHttpRequest();
xhr.open('GET', url/file,true);
xhr.onreadystatechange = function() {
if(xhr.readyState==4){
if(xhr.status==200){
var data=xhr.responseText;
console.log(data);
}
};
xhr.onerror = function() {
console.log("Oh, error");
};
xhr.send();
复制代码
一样咱们使用fetch请求JSON数据:json
fetch(url).then(response => response.json())//解析为可读数据
.then(data => console.log(data))//执行结果是 resolve就调用then方法
.catch(err => console.log("Oh, error", err))//执行结果是 reject就调用catch方法
复制代码
从二者对比来看,fetch代码精简许多,业务逻辑更清晰明了,使得代码易于维护,可读性更高。 总而言之,Fetch 优势主要有:api
1. 语法简洁,更加语义化,业务逻辑更清晰bash
2. 基于标准 Promise 实现,支持 async/await网络
3. 同构方便,使用isomorphic-fetchapp
因为 Fetch API 是基于 Promise 设计,接下来咱们简单介绍下Promise工做流程,方便你们更好理解Fetch。 框架
fetch方法返回一个Promise对象, 根据 Promise Api 的特性, fetch能够方便地使用then方法将各个处理逻辑串起来, 使用 Promise.resolve() 或 Promise.reject() 方法将分别返会确定结果的Promise或否认结果的Promise, 从而调用下一个then 或者 catch。一旦then中的语句出现错误, 也将跳到catch中。异步
接下来将介绍如何使用fetch请求本地文本数据,请求本地JSON数据以及请求网络接口。其实操做相比与Ajax,简单不少!async
//HTML部分
<div class="container">
<h1>Fetch Api sandbox</h1>
<button id="button1">请求本地文本数据</button>
<button id="button2">请求本地json数据</button>
<button id="button3">请求网络接口</button>
<br><br>
<div id="output"></div>
</div>
<script src="app.js"></script>
复制代码
本地有一个test.txt文档,经过如下代码就能够获取其中的数据,而且显示在页面上。
document.getElementById('button1').addEventListener('click',getText);
function getText(){
fetch("test.txt")
.then((res) => res.text())//注意:此处是res.text()
.then(data => {
console.log(data);
document.getElementById('output').innerHTML = data;
})
.catch(err => console.log(err));
}
复制代码
本地有个posts.json数据,与请求本地文本不一样的是,获得数据后还要用forEach遍历,最后呈如今页面上。
document.getElementById('button2').addEventListener('click',getJson);
function getJson(){
fetch("posts.json")
.then((res) => res.json())
.then(data => {
console.log(data);
let output = '';
data.forEach((post) => {
output += `<li>${post.title}</li>`;
})
document.getElementById('output').innerHTML = output;
})
.catch(err => console.log(err));
}
复制代码
获取https://api.github.com/users中的数据,作法与获取本地JSON的方法相似,获得数据后,一样要通过处理
document.getElementById('button3').addEventListener('click',getExternal);
function getExternal(){
// https://api.github.com/users
fetch("https://api.github.com/users")
.then((res) => res.json())
.then(data => {
console.log(data);
let output = '';
data.forEach((user) => {
output += `<li>${user.login}</li>`;
})
document.getElementById('output').innerHTML = output;
})
.catch(err => console.log(err));
}
复制代码