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 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
如何实现textarea里的不同文本显示不同颜色
Jan 20 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
Dec 16 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
在Vue mounted方法中使用data变量详解
Nov 05 Javascript
js里面的变量范围分享
Jul 18 Javascript
Vue的自定义组件不能使用click方法的解决
Jul 28 Javascript
vue中三级导航的菜单权限控制
Mar 31 Vue.js
小程序实现侧滑删除功能
Jun 25 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垃圾回收机制引用计数器概念分析
2013/06/24 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Bootstrap菜单按钮及导航实例解析
2016/09/09 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python 基础教程之包和类的用法
2017/02/23 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
优秀实习自我鉴定
2013/12/04 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android