欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

fetch 如何实现请求数据

程序员文章站 2022-03-13 18:52:52
一 序言 在 传统ajax 时代,进行 api 等网络请求都是通过xmlhttprequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并...

一 序言

在 传统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. 同构方便,使用

三 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));
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。