龙空技术网

前端笔记——尝试理解并在JavaScript中使用Fetch()

爱分享Coder 190

前言:

现在同学们对“jsfetch”可能比较珍视,大家都需要了解一些“jsfetch”的相关知识。那么小编在网摘上收集了一些有关“jsfetch””的相关知识,希望朋友们能喜欢,同学们一起来学习一下吧!

介绍

Fetch()方法可以发出类似于XMLHttpRequest(XHR)的网络请求。Fetch API和XMLHttpRequest之间的主要区别(也称为XHR)是Fetch API使用Promises,可以编写更简洁的API调用,从而严格避免回调地狱并降低XMLHttpRequest的复杂性




使用之前使用XMLHttpRequest

在使用fetch之前,我们先可以了解下XMLHttpRequest,XMLHttpRequest需要设置两个侦听器来处理成功响应和错误响应情况,并调用open()和send()

function getAllPosts() {  let data = JSON.parse(this.responseText);  console.log(data);}let reqError = err => {  console.log("Error", err);};let req = new XMLHttpRequest();req.onload = getAllPosts;req.onerror = reqError;req.open("GET", ";, true); req.send();
使用Fetch

现在看一下“Fetch之美”。让我们使用Fetch重写上面的代码。我们可以使用多种方式使用fetch方法,可以使用then方法或使用async / await方法。让我们看看如何做到这一点:

1、使用Async/Await:

使用try/catch,async / await使处理同步和异步错误相对容易:

async function getAllPosts() {          try {            let response = await  fetch("" );            const data = await response.json();            console.log(data);          } catch (err) {            console.log(err);          }      }

2、使用then

调用then方法的缺点就是容易在大量回调请求的时候造成回调地狱,很难维护代码

function getAllPosts() {        fetch(";)          .then(response => response.json())          .then(data => { console.log(data)})          .catch(err => {console.log(err);          });      }
基本响应类型

当我们发出fetch请求时,响应会被指定为CORS类型,opaque或basic。这些响应类型指示资源的来源,这也让你知道如何处理响应:

解释:当来自同一来源的请求时,响应将具有基本类型,并且可以从响应中看到的内容没有任何限制;如果从其他来源发出请求,则响应将具有CORS类型。除了CORS响应将可以查看的标头限制为Cache-Control,Content-Language,Content-Type,Expires和Last-Modified外,CORS和基本响应类型几乎相同;opaque响应是针对来自其他来源的资源(不返回CORS标头)的请求。这种类型的响应读取不了返回的数据或查看请求的状态,这意味着无法检查请求是否成功。用fetch发出POST请求

除了可以从api获取数据之外,我们还可以使用Fetch方法执行其他操作。假设我们要向博客API添加一个新博客,我们也可以使用Fetch方法来完成该操作:

下面可以是一个表单提交方式:

<form id="postData">      <div>        <input type="text" name="" id="title" placeholder="Title" />      </div>      <div>        <textarea name="" id="body" cols="20" placeholder="Content" rows="5"></textarea>      </div>      <input type="submit" value="添加" /></form>

现在,我们有了一个用于添加新博客文章的表单,让我们编写一个脚本,该脚本会将数据发送到添加API的请求:

document.getElementById("postData").addEventListener("submit", addNewPost);        async function addNewPost(event) {        try {          event.preventDefault();//阻止默认行为          let tittle = document.getElementById("title").value;           let body = document.getElementById("body").value;           let response = await fetch("****",{              method: "POST",              headers: {"Content-Type": "application/json"},              body: JSON.stringify({ tittle: tittle, body: body })            }          );          const data = await response.json();          console.log(data);        } catch (err) {          console.log(err);        }      }
使用Fetch上传文件

我们还可以使用Fetch处理文件上传,例如图像和文档:

document.getElementById("postData").addEventListener("submit", uploadfile);      async function uploadfile(event) {        try {          event.preventDefault();          const fileField = document.querySelector('input[type="file"]');          const formData = new FormData();          formData.append("avatar", fileField.files[0]);          let response = await fetch("...",{              method: "POST",              headers: { "Content-Type": "application/json" },              body: formData            });          const data = await response.json();          console.log(data);        } catch (err) {          console.log(err);        }    }
总结

尽管fetch是用于发出网络请求的更好方法,新的fetch API似乎比XHR更快,更易于使用。毕竟,它是为了使我们能够以正确的方式处理AJAX请求而创建的。


标签: #jsfetch