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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
Javascript 面向对象特性
Dec 28 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 Javascript
详解Bootstrap 学习(一)入门
Apr 12 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
js 解析 JSON 数据简单示例
Apr 21 Javascript
vue引入静态js文件的方法
Jun 20 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 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
php计算数组不为空元素个数的方法
2014/01/27 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
利用Python计算KS的实例详解
2020/03/03 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
优秀社区干部事迹材料
2014/02/03 职场文书
双创工作实施方案
2014/03/26 职场文书
小学二年级评语
2014/04/21 职场文书
计算机软件专业求职信
2014/06/10 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
公司授权委托书范本
2014/09/18 职场文书
售房协议书范本2014
2014/10/23 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
跳高加油稿
2015/07/21 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
移除Selenium中window.navigator.webdriver值
2022/06/10 Python