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 相关文章推荐
javascript 限制输入和粘贴(IE,firefox测试通过)
Nov 14 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
May 08 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
Sep 28 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
vue实现动态列表点击各行换色的方法
Sep 13 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
Nov 04 Javascript
解决layer.confirm选择完之后消息框不消失的问题
Sep 16 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
Nov 16 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脚本
2006/11/26 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
跟老齐学Python之用while来循环
2014/10/02 Python
浅谈Python中数据解析
2015/05/05 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python中字符串的修改及传参详解
2016/11/30 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
ubuntu上安装python的实例方法
2019/09/30 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
优秀干部获奖感言
2014/01/31 职场文书
演讲稿的写法
2014/05/19 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
优秀教师个人总结
2015/02/11 职场文书
春秋淹城导游词
2015/02/11 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书