微信号:JavaScriptcn

介绍:面向JavaScript爱好人员提供:前端最新资讯、原创内容、JavaScript、HTML5、Ajax、jQuery、Node.js等一系列教程和经验分享.

fetch 如何请求数据

2018-12-21 17:31 浪里行舟

一 序言

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

二 与Ajax对比

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

 
           
  1. var xhr = new XMLHttpRequest();

  2. xhr.open('GET', url/file,true);

  3. xhr.onreadystatechange = function() {

  4.   if(xhr.readyState==4){

  5.        if(xhr.status==200){

  6.            var data=xhr.responseText;

  7.             console.log(data);

  8.   }

  9. };

  10. xhr.onerror = function() {

  11.  console.log("Oh, error");

  12. };

  13. xhr.send();

同样我们使用fetch请求JSON数据:

 
           
  1. fetch(url).then(response => response.json())//解析为可读数据

  2.  .then(data => console.log(data))//执行结果是 resolve就调用then方法

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

四 请求常见数据格式

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

 
           
  1. //HTML部分

  2.  <div class="container">

  3.    <h1>Fetch Api sandbox</h1>

  4.    <button id="button1">请求本地文本数据</button>

  5.    <button id="button2">请求本地json数据</button>

  6.    <button id="button3">请求网络接口</button>

  7.    <br><br>

  8.    <div id="output"></div>

  9.  </div>

  10.  <script src="app.js"></script>

1.fetch请求本地文本数据

本地有一个test.txt文档,通过以下代码就可以获取其中的数据,并且显示在页面上。

 
           
  1. document.getElementById('button1').addEventListener('click',getText);

  2. function getText(){

  3.  fetch("test.txt")

  4.      .then((res) => res.text())//注意:此处是res.text()

  5.      .then(data => {

  6.        console.log(data);

  7.        document.getElementById('output').innerHTML = data;

  8.      })

  9.      .catch(err => console.log(err));

  10. }

2.fetch请求本地JSON数据

本地有个posts.json数据,与请求本地文本不同的是,得到数据后还要用forEach遍历,最后呈现在页面上。

 
           
  1. document.getElementById('button2').addEventListener('click',getJson);

  2. function getJson(){

  3.  fetch("posts.json")

  4.      .then((res) => res.json())

  5.      .then(data => {

  6.        console.log(data);

  7.        let output = '';

  8.        data.forEach((post) => {

  9.          output += `<li>${post.title}</li>`;

  10.        })

  11.        document.getElementById('output').innerHTML = output;

  12.      })

  13.      .catch(err => console.log(err));

  14. }

3.fetch请求网络接口

获取 https://api.github.com/users中的数据,做法与获取本地JSON的方法类似,得到数据后,同样要经过处理

 
           
  1. document.getElementById('button3').addEventListener('click',getExternal);

  2. function getExternal(){

  3.  // https://api.github.com/users

  4.  fetch("https://api.github.com/users")

  5.      .then((res) => res.json())

  6.      .then(data => {

  7.        console.log(data);

  8.        let output = '';

  9.        data.forEach((user) => {

  10.          output += `<li>${user.login}</li>`;

  11.        })

  12.        document.getElementById('output').innerHTML = output;

  13.      })

  14.      .catch(err => console.log(err));

  15. }

END

作者:浪里行舟
https://segmentfault.com/a/1190000017453672

 
JavaScript 更多文章 看懂英文技术文档,每天只需要10分钟做这件事…… 我是如何将页面加载时间从6S降到2S的? 2019 - Web开发技术指南和趋势 Chrome 被曝新 Bug,导致 CPU 使用率飙升至 100% 原来 CSS 与 JS 是这样阻塞 DOM 解析和渲染的
猜您喜欢 OneOaaS云栖大会参展 O2O产品质量保障体系(三)| 百度糯米电影消费链数据质量保障 大荔冬枣,你值得拥有 最杀马特的教授,恶搞川普希拉里,却是计算机图形学的奇才 舌尖上的CTO系列之二:砂锅馄饨的交付件