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 相关文章推荐
(仅IE下有效)关于checkbox 三态
May 12 Javascript
JavaScript中链式调用之研习
Apr 07 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
动态改变div的z-index属性的简单实例
Aug 08 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
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
深入了解php4(2)--重访过去
2006/10/09 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
详解VUE 数组更新
2017/12/16 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
如何查找网页漏洞
2016/06/22 面试题
营销总经理的岗位职责
2013/12/15 职场文书
个人求职信范例
2014/01/29 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
班主任工作总结范文
2015/08/13 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android