Fetch使用方法

article/2025/7/9 15:29:48

前言:

  fetch是用来取代传统的XMLHttpRequest的。 它的优点很多,包括链式调用的语法、返回promise等。

 

什么是fetch?

  fetch api是基于promise的设计,它是为了取代传统xhr的不合理的写法而生的。

 

WHY fetch?

  xhr请求写起来非常的混乱,如下所示:

复制代码

var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'json';xhr.onload = function() {console.log(xhr.response);
};xhr.onerror = function() {console.log("Oops, error");
};xhr.send();

复制代码

  

  但是使用fetch之后,如下所示:

复制代码

fetch(url).then(function(response) {return response.json();
}).then(function(data) {console.log(data);
}).catch(function(e) {console.log("Oops, error");
});

复制代码

  这种链式调用的风格看上去会非常舒服。

 

  如果我们再使用了箭头函数就会更加简洁了。 

fetch(url).then(response => response.json()).then(data => console.log(data)).catch(e => console.log("Oops, error", e))

  

  通过使用fetch api,可以将传统的xhr的粗糙的使用方法转化的如此精简,实在是好! 

 

  但是呢? 使用Promise,还是可以很明显看到callback的使用,不急,我们还可以使用 async、await :

复制代码

// Async/Await requirements: Latest Chrome/FF browser or Babel: https://babeljs.io/docs/plugins/transform-async-to-generator/
// Fetch requirements: Latest Chrome/FF browser or Github fetch polyfill: https://github.com/github/fetch// async function
async function fetchAsync () {// await response of fetch calllet response = await fetch('https://api.github.com');// only proceed once promise is resolvedlet data = await response.json();// only proceed once second promise is resolvedreturn data;
}// trigger async function
// log response or catch error of fetch promise
fetchAsync().then(data => console.log(data)).catch(reason => console.log(reason.message))

复制代码

  这样看上去是不是就好多了呢?

注意: 对于async和await的使用还是很明确的,就是一般我们在一个异步函数之前添加 await 关键词,然后在这个 await 的相关代码外面使用的时 async 函数,这样的结合才是合适的。

利用 async 和 await,我们就可以像写同步代码一样来写异步代码啦! 

但是呢,目前async 和 await 的支持性还不是很好,目前还无法在一般的浏览器中使用!

   

 

 

 

 

 

 

 

 

 

  

基本使用方法:

fetch必须接受一个资源路径作为参数,并且返回了一个promise,所以我们可以直接使用链式调用的方式。 

复制代码

 fetch("/getAllProduct").then(function(res) {return res.json();}).then(function (data) {if (data.code == 200) {console.log('获取到所有产品' ,data.data);that.props.addAllProduct(data.data);} else {console.log(data.message);}})

复制代码

这样,我们就可以发送一个ajax请求。

复制代码

/* 对客户端的返回数据封装* @param [code] (number) code为返回的状态码* @param [message] (string) message为返回的信息* @param [data] (any) data是可选的,为返回给前端的数据*/
// 注意: retrunJson中的res为node处理接口的回调函数中的res,这个是必须的。
function returnJson(res, code, message, data) {var response = {code: code,message: message};if (typeof data !== 'undefined') {response.data = data;}res.json(response);// 返回这个请求之后,必须要 res.end()表示请求的结束,否则后台可能会崩溃。  res.end();
}router.post('/register', function (req, res) {let userName = req.body.username,password = req.body.password,passwordAgain = req.body.passwordAgain,type = req.body.type;console.log(userName, password, type);if (type == 1) {if (password == passwordAgain) {let managerId = uuidv1();console.log(userName, password, passwordAgain);var newUser = new Manager({name: userName,password: password,type: req.body.type,managerId: managerId});Manager.find(userName, function (err, user) {if (err) {returnJson(res, 5001, '服务器错误,注册失败');} else {if (user !== null) {returnJson(res, 4003, "此用户已经注册!");} else {// 如果符合条件,就注册该用户,将数据保存在数据库。newUser.save(function (err, user) {if (err) {// 服务器端错误,失败返回状态码500returnJson(res, 500, "用户注册失败!");} else {// user数据较简单,直接传递user即可,如果复杂,我们可以考虑使用对象形式传递更多数据。returnJson(res, 200, "用户注册成功!", user);}});}}});} else {returnJson(res, 4001, "用户两次输入密码不一致!");}} else if( type == 2) {if (password == passwordAgain) {let userId = uuidv1();console.log(userName, password, passwordAgain);var newUser = new User({name: userName,password: password,type: req.body.type,userId: userId});User.find(userName, function (err, user) {if (err) {returnJson(res, 5001, '服务器错误,注册失败');} else {if (user !== null) {returnJson(res, 4003, "此用户已经注册!");} else {// 如果符合条件,就注册该用户,将数据保存在数据库。newUser.save(function (err, user) {if (err) {// 服务器端错误,失败返回状态码500returnJson(res, 500, "用户注册失败!");} else {// user数据较简单,直接传递user即可,如果复杂,我们可以考虑使用对象形式传递更多数据。returnJson(res, 200, "用户注册成功!", user);}});}}});} else {returnJson(res, 4001, "用户两次输入密码不一致!");}}
});

复制代码

这样,我们就可以处理一个ajax请求。

 

 

 

 

注意点:

1、fetch() 返回的是一个Promise对象。

  fetch使用的promise对象可以使得我们使用同步的方式写异步函数。

 

2、 fetch api是可以结合 async 和 await 来使用的。 

  fetch是基于promise实现的,但是使用promise的写法,我们还是可以看到callback的影子,如果结合 async和await来使用,还是非常不错的。

 

3、 Fetch api 提供的spi囊括但是不限于xhr的所有功能。

 

4、 fetch api 可以跨域。 

  参考: https://fetch.spec.whatwg.org/#http-cors-protocol

  跨域请求必须包括  Origin 作为header. 

     以上。

    我们在发送fetch请求的时候就会使用到CORS协议,尽管这些对于开发者来说是透明的,但是浏览器还是会发送 origin 字段。 

 

5、fetch提供了对request和response对象的通用定义。

  Fetch 提供了对 Request 和 Response (以及其他与网络请求有关的)对象的通用定义。所以在一个Fetch请求中,完全可以只使用Request 和 Response两个对象,通过Request 设置参数,通过Response 对返回值进行处理。 

 所以,我们可以将一个fetch定义如下:

复制代码

var myHeaders = new Headers();
myHeaders.append('Content-Type', 'image/jpeg');
var option = { method: 'GET',headers: myHeaders,mode: 'cors',cache: 'default' };
var myRequest = new Request('https://api.github.com/users/mzabriskie',option);
fetch(myRequest).then(function(response) {... 
});

复制代码

 所有主要的浏览器(除了Opera Mini和老的IE)都支持Fetch。针对不支持的,可以使用Fetch polyfill  

https://www.cnblogs.com/zhuzhenwei918/p/7249691.html


http://chatgpt.dhexx.cn/article/iSoQUiVQ.shtml

相关文章

彻底关闭烦人的---FF新推荐

1、进入控制面板——>管理工具——>服务 找到Flash Helper Service服务 2、进入控制面板——>管理工具——>任务计划程序 找到FlashHelper TaskMachineCore的任务,将其删除

如何关闭flashhelper的ff新推荐广告弹窗

描述:如何关闭flashhelper的ff新推荐广告弹窗 步骤: 方法一,直接C盘搜索flashhelper文件,删除即可方法二,在计算机管理服务里面,找到flashhelper禁用

ff新推荐的关闭办法

这个是flash的广告 如果直接删除Adobe Flash Helper会导致flash的不正常使用 建议是winR在输入框中输入service,在service里找到 然后停用再禁用掉就可以了

“FF新推荐”猥琐的弹窗如何关闭?

自己的电脑中时常会弹出一个叫“FF新推荐”的广告弹窗,扰民不说显示的内容也很猥亵。 特别是在演示文档,开会时就特别尴尬。 1. FF新推荐是个什么鬼?只要你安装了Flash控件会自动更新弹窗这个莫名其妙,十分尴尬的弹窗&#xff0…

禁用FF新鲜事广告

不知道啥时候起,电脑开机之后总会弹出莫名其妙的FF新鲜事广告,如图 定睛一看,Flash助手推荐,原来Flash才是罪魁祸首。这不能忍。打开任务管理器,不停按f,可以找到一个叫Flash Helper Service的进程&#xf…

FF新推荐弹窗怎么彻底让他爬

背景:不知道怎么就捆绑安装了这个流氓软件,还找不到位置,不知道在哪删?今天突然灵机一动试了一下这个方法,然后可行 第一步:守株待兔——等他不经意的弹出 第二步:欲擒故纵——点击右上角菜单创…

git merge之--no-ff 的作用

禁止使用快进模式 no-fast—forward $ git merge --no-ff -m "merge with no-ff" dev在许多介绍 Git 工作流的文章里,都会推荐在合并分支时,加上 --no-ff 参数: $ git checkout develop $ git merge --no-ff feature–no-ff 在这的…

如何卸载FF推荐?

很多小伙伴们都发现,近一段时间,自己的电脑中时常会弹出一个叫“FF新推荐”的广告弹窗,扰民不说显示的内容也很猥亵。按理说,电脑上开启拦截软件后,一般的广告弹窗是不会出现的,那么这个能跳过安全工具拦截…

git merge 合并时 --no-ff 的作用——主要影响版本回退(好文章!)

在许多介绍 Git 工作流的文章里,都会推荐在合并分支时,加上 --no-ff 参数: $ git checkout develop$ git merge --no-ff feature --no-ff 在这的作用是禁止快进式合并。我们平常什么都不加的时候,则使用默认的 --ff &#xff0c…

win10如何禁用\删除讨厌的ff新鲜事(ff新推荐)(flash弹窗广告)

雾草,Adobe Flash植入的这种广告太变态了! 定位: 打开运行窗口(winr),输入“services.msc”,之后回车确定 然后我们在弹出来的窗口中找到“flash helper service”选项,之后右键…

#FF00FF(255,0,255)应该是紫色(Purple),把#FF00FF称为“品红”(“洋红/Magenta”)是一种误称

作者:❄️固态二氧化碳❄️ (主页) 链接:#FF00FF(255,0,255)应该是紫色(Purple),把#FF00FF称为"品红"(“洋红/Magenta”)是一种误称 - 固态二氧化碳的博客 - CSDN博客 来源:CSDN博客 发表时间:2019年06月02日 18:31:06 …

音乐推荐系统

✨写在前面:强烈推荐给大家一个优秀的人工智能学习网站,内容包括人工智能基础、机器学习、深度学习神经网络等,详细介绍各部分概念及实战教程,通俗易懂,非常适合人工智能领域初学者及研究者学习。➡️点击跳转到网站。…

推荐系统算法--ItemCF--MF(ALS)--FF

1.ItemCF: 协同过滤是什么? 协同过滤 (Collaborative filtering),指的是,通过收集群体用户的偏好信息,自动化预测(过滤)个体用户可能感兴趣的内容。协同(collaborating&#xff09…

Git merge时使用--no-ff参数

/1、Git:Git-merge的–ff和–no-ff。 前言 Git merge最容易糊涂的地方就是这个--ff参数和--no-ff 参数,通过本文,把这个整理清楚。 其实官网讲的非常清楚,不过可能因为是英文的,所以大家阅读起来会有一些障碍。&…

如何清除弹窗FF新推荐

前言:一个星期日的下午,我打算过肥宅的生活,吃的东西已经就位,当我打开电脑后跳出了这个玩意,瞬间好心情全无。身为程序员,感觉受到了侮辱。 一 Adobe Flash简介 查看任务管理器查看详细信息如下&#xf…

ff新推荐弹窗怎么彻底删除---解决方案

根源:几乎所有的电脑中都会安装Flash Player,而FF新推荐弹窗就是Flash Player的,那么Win7、Win10系统FF新推荐怎么卸载? 方法一:直接删除FF新推荐 1、如果FF新推荐弹出之后,先不要关闭掉,使用键…

彻底关闭弹出广告“FF新推荐”

很多小伙伴们都发现,近一段时间,自己的电脑中时常会弹出一个叫“FF新推荐”的广告弹窗,扰民不说显示的内容也很猥亵。一检查发现居然是Flash中国官方干的,安装了flash播放器后就弹出广告。就像下面这样的: 1. FF新推荐…

Java课程设计

学生考勤管理系统 文章目录 学生考勤管理系统一、 前言1、设计背景2、系统设计的目的及意义3、 调查用户需求 二、 系统简介三、 功能介绍1、服务器启动2、登陆3、学生端4、 老师端 四、 系统调试实现1、老师端2、学生端 五、 总结 一、 前言 1、设计背景 随着社会的发展&…

软件测试学习路线

软件测试学习路线图 随着互联网IT产业的蓬勃发展,软件测试的行业也日趋火热,更多人的转向了软件测试行业,当然更多的问题也亟待解决,比如软件测试自学教程视频内容?软件测试视频教程?软件测试培训入门教程?软件测试培训学习思路?鉴此千锋教育不惜教育成本,全面推出软…

学习Altium Designer软件总结

广西●河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.08.22 学习Altium Designer软件总结 因学习了AD,在此总结一下步骤和我遇到的问题以及的解决方法。 (1…