Fetch使用方法
前言:
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 call
let response = await fetch('https://api.github.com');
// only proceed once promise is resolved
let data = await response.json();
// only proceed once second promise is resolved
return 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 == ) {
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 == ) {
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, , '服务器错误,注册失败');
} else {
if (user !== null) {
returnJson(res, , "此用户已经注册!");
} else {
// 如果符合条件,就注册该用户,将数据保存在数据库。
newUser.save(function (err, user) {
if (err) {
// 服务器端错误,失败返回状态码500
returnJson(res, , "用户注册失败!");
} else {
// user数据较简单,直接传递user即可,如果复杂,我们可以考虑使用对象形式传递更多数据。
returnJson(res, , "用户注册成功!", user);
}
});
}
}
});
} else {
returnJson(res, , "用户两次输入密码不一致!");
}
} else if( type == ) { 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, , '服务器错误,注册失败');
} else {
if (user !== null) {
returnJson(res, , "此用户已经注册!");
} else {
// 如果符合条件,就注册该用户,将数据保存在数据库。
newUser.save(function (err, user) {
if (err) {
// 服务器端错误,失败返回状态码500
returnJson(res, , "用户注册失败!");
} else {
// user数据较简单,直接传递user即可,如果复杂,我们可以考虑使用对象形式传递更多数据。
returnJson(res, , "用户注册成功!", user);
}
});
}
}
});
} else {
returnJson(res, , "用户两次输入密码不一致!");
}
}
});
这样,我们就可以处理一个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) {
...
});
参考文章: https://github.com/camsong/blog/issues/2
Fetch使用方法的更多相关文章
- fetch get方法的时候报错
fetch 报错 Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body. 翻译过来就 ...
- Fetch方法封装、业务实践
说Fetch之前啊,我们不得不说一说Ajax了,以前使用最多的自然是jQuery封装的Ajax方法了,强大而且好用. 有人说了,jQuery的Ajax都已经封装得那么好了,你还整Fetch干什么,这不 ...
- [转] 传统 Ajax 已死,Fetch 永生
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...
- 新一代Ajax API --fetch
之前 师傅跟我提过 一个新的Ajax API fetch 今天看到一篇关于fetch的文章,受益匪浅. XMLHttpRequest并不是专为Ajax而设计的,虽然各种框架对XHR的封装已经足够好用 ...
- React Native中的网络请求fetch和简单封装
React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...
- 传统 Ajax 已死,Fetch 永生
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...
- backbone中get和fetch的区别
我也是刚开始接触backbone.js对于里面的很多东西都看过,但是具体在使用起来还是有很多问题,其中一个就是get和fetch的区别,这个让我很纠结,都是获取模型的数据,干嘛要有两个呢?最近好像弄明 ...
- Fetch和ajax的比较和区别
传统 Ajax 已死,Fetch 永生 Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全 ...
- hibernate left join fetch 出错的问题
1.首先说说manyToOne的问题 比如一个用户所在的组织机构,可能是多个,最多是四个,然后userEntity有下的代码: 关联查询: 第一种方式:代码如下 StringBuilder sql = ...
随机推荐
- Flash的不同位宽与CPU地址线的接线问题?
一般Flash都有8.16.32等这些不同的位宽,当然说白了就是Flash的数据线位数. 在Flash与CPU的地址线的连接问题时:不同位宽的有不同的连接方法: 一般是:位宽为8时CPU的ADDR0与 ...
- 日志文件(关于#IRSA_MDPS_RDM软件 密码登录事项 7月26号)
1.登录:sqlplus 用户名:scott 口令:123 qweas.. //2018-7-16号更改密码 2.查看该用户(已登录)下有几个表:select table_name from user ...
- Sophus VS2010编译不支持?C++11语法的缘故。那有没有不带C++11特性的Sophus版本呢?
Eigen:3.1 3.0 Ceres:No Sophus: Sophus支不支持Windows编译?官网写的是通过了Windows的编译的 linux, os x: windows: code ...
- MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...
- solr特点一:高亮(highlighting)
高亮的配置 参数详细说明: hl.fl: 用空格或逗号隔开的字段列表.要启用某个字段的highlight功能,就得保证该字段在schema中是stored.如果该参数未被给出,那么就会高亮默认字段 s ...
- .net core 2.1-----Sql Server数据库初体验
刚开始接触asp.net core,在学习的过程中遇到了一些小问题,在这里记录一下! 在我们项目的开发过程中,肯定会和数据库打交道,所以我尝试了一下用asp.net core链接数据库,并读取表中的数 ...
- C#中实现对象的深拷贝
深度拷贝指的是将一个引用类型(包含该类型里的引用类型)拷贝一份(在内存中完完全全是两个对象,没有任何引用关系).......... 直接上代码: /// <summary> /// 对象的 ...
- textarea 高度自动
<textarea id="suggest" type="text" name="suggest" class="form- ...
- jdk-7u40-windows-i586的安装
1.预备知识: i586 指的是windows 32bit版本 Oracle.微软.IBM这些大佬们最“贵族”了-----他们都很喜欢 C盘 2.关键 JDK必须装在C盘目录下,才能在命令行下正确运行 ...
- pageadmin CMS网站建设教程:网页设计的常用参数
由于网络速度问题,我们需要考虑图片大小对传输速度的影响,如果图片太大就会影响浏览速度,访问者很快就会对这个网站失去了兴趣,只有充分了解图片质量与下载速度的关系,并了解不同的文件格式,才能更有效的表达内 ...