fetch 如何实现请求数据


Posted in Javascript onDecember 20, 2018

一 序言

在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好。今天我们介绍的Fetch提供了一个更好的替代方法,它不仅提供了一种简单,合乎逻辑的方式来跨网络异步获取资源,而且可以很容易地被其他技术使用,例如 Service Workers。

fetch 如何实现请求数据

二 与Ajax对比

使用Ajax请求一个 JSON 数据一般是这样:

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数据:

fetch(url).then(response => response.json())//解析为可读数据
 .then(data => console.log(data))//执行结果是 resolve就调用then方法
 .catch(err => console.log("Oh, error", err))//执行结果是 reject就调用catch方法

从两者对比来看,fetch代码精简许多,业务逻辑更清晰明了,使得代码易于维护,可读性更高。

总而言之,Fetch 优点主要有:

1. 语法简洁,更加语义化,业务逻辑更清晰

2. 基于标准 Promise 实现,支持 async/await

3. 同构方便,使用isomorphic-fetch

三 Promise简介

由于 Fetch API 是基于 Promise 设计,接下来我们简单介绍下Promise工作流程,方便大家更好理解Fetch。

fetch 如何实现请求数据

fetch方法返回一个Promise对象, 根据 Promise Api 的特性, fetch可以方便地使用then方法将各个处理逻辑串起来, 使用 Promise.resolve() 或 Promise.reject() 方法将分别返会肯定结果的Promise或否定结果的Promise, 从而调用下一个then 或者 catch。一旦then中的语句出现错误, 也将跳到catch中。

四 请求常见数据格式

接下来将介绍如何使用fetch请求本地文本数据,请求本地JSON数据以及请求网络接口。其实操作相比与Ajax,简单很多!

//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>

1.fetch请求本地文本数据

本地有一个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));
}

2.fetch请求本地JSON数据

本地有个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));
}

3.fetch请求网络接口

获取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));
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
收集的10个免费的jQuery相册
Feb 26 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
node.js中的fs.ftruncate方法使用说明
Dec 15 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
Feb 29 Javascript
JS实现图片的不间断连续滚动的简单实例
Jun 03 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
利用原生JS实现data方法示例代码
May 28 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
解决vue项目,npm run build后,报路径错的问题
Aug 13 Javascript
JS闭包经典实例详解
Dec 20 #Javascript
JS闭包原理与应用经典示例
Dec 20 #Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 #Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 #Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 #Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 #Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
Dec 20 #Javascript
You might like
自己做矿石收音机
2021/03/02 无线电
对盗链说再见...
2006/10/09 PHP
php SQL之where语句生成器
2009/03/24 PHP
解析php类的注册与自动加载
2013/07/05 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
用python实现批量重命名文件的代码
2012/05/25 Python
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
pandas 选择某几列的方法
2018/07/03 Python
Django 视图层(view)的使用
2018/11/09 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python线程池如何使用
2020/05/28 Python
Django之腾讯云短信的实现
2020/06/12 Python
初入社会应届生求职信
2013/11/18 职场文书
小学六年级学生评语
2014/04/22 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
基于Python实现对比Exce的工具
2022/04/07 Python