用ES6和fetch封装网络请求
导读:
fetch:
这个方法是ES2017中新增的特性,这个特性出来后给人一种传统ajax已死的感觉,其实它的作用是替代浏览器原生的XMLHttpRequest异步请求,
我们在日常的开发中,基本不会自己去写XMLHttpRequest,主要是太复杂了,都是使用已经封装好了的各种插件,常用的有jquery。npm包管理工具也提供了axios,request等模块。
而有了fetch后我们就可以在不用这些插件的情况下快速简单的实现异步请求了。
async/await 能使得我们在编写异步代码时像同步一样的方式来编写。具体是将异步执行的代码封装了或者作为模块导入即可。
fetch.js为封装好的模块,调用方式如下:
另起一个getData.js,用来封装所有的Service,调用fetch。
例 :
getData.js
import fetch from '../config/fetch' /**
* 获取首页默认地址
*/ export const cityGuess = () => fetch('/v1/cities', {
type: 'guess'
});
/**
* 获取搜索地址
*/ export const searchplace = (cityid, value) => fetch('/v1/pois', {
type: 'search',
city_id: cityid,
keyword: value
}); /**
* 获取msite页面地址信息
*/ export const msiteAddress = geohash => fetch('/v2/pois/' + geohash);
fetch.js
import {
baseUrl
} from './env' export default async(url = '', data = {}, type = 'GET', method = 'fetch') => {
type = type.toUpperCase();
url = baseUrl + url; if (type == 'GET') {
let dataStr = ''; //数据拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
}) if (dataStr !== '') {
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
url = url + '?' + dataStr;
}
} if (window.fetch && method == 'fetch') {
let requestConfig = {
credentials: 'include',
method: type,
headers: {
'Accept': 'application/json',// 用户代理可处理的媒体类型// 用户代理可处理的媒体类型
'Content-Type': 'application/json'// 报文主体对象类型
},
mode: "cors",// 跨域
cache: "force-cache"
} if (type == 'POST') {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
})
} try {
const response = await fetch(url, requestConfig);
const responseJson = await response.json();
return responseJson
} catch (error) {
throw new Error(error)
}
} else {
// 如果浏览器不支持 fetch
return new Promise((resolve, reject) => {
let requestObj;
if (window.XMLHttpRequest) {
requestObj = new XMLHttpRequest();
} else {
requestObj = new ActiveXObject;
} let sendData = '';
if (type == 'POST') {
sendData = JSON.stringify(data);
} requestObj.open(type, url, true);
requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
requestObj.send(sendData); requestObj.onreadystatechange = () => {
if (requestObj.readyState == 4) {
if (requestObj.status == 200) {
let obj = requestObj.response
if (typeof obj !== 'object') {
obj = JSON.parse(obj);
}
resolve(obj)
} else {
reject(requestObj)
}
}
}
})
}
}
用ES6和fetch封装网络请求的更多相关文章
- [iOS微博项目 - 3.3] - 封装网络请求
github: https://github.com/hellovoidworld/HVWWeibo A.封装网络请求 1.需求 为了避免代码冗余和对于AFN框架的多处使用导致耦合性太强,所以把网 ...
- App 组件化/模块化之路——如何封装网络请求框架
App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...
- 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据
§ 封装网络请求及 mock 数据 本文配套视频地址: https://v.qq.com/x/page/i05544fogcm.html 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发 ...
- 09事件传递参数-封装网络请求api get和post合并整合在一起
1==>通过点击事件进行传递参数 <view bindtap="goEdution" data-index="5">西南大学</view ...
- React Native探索(五)使用fetch进行网络请求
相关文章 React Native探索系列 前言 React Native可以使用多种方式来请求网络,比如fetch.XMLHttpRequest以及基于它们封装的框架,fetch可以说是替代XMLH ...
- 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)
http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...
- andriod开发,简单的封装网络请求并监听返回.
一.为什么封装 因为android 4.0 以后的发送网络请求必须要放到异步线程中,而异步线程必须跟handle合作才能更新主线程中的UI,所以建议用一个类继承handler来异步处理网络请求. 二. ...
- 第六十二篇、AFN3.0封装网络请求框架,支持缓存
1.网络请求 第一种实现方式: 功能:GET POST 请求 缓存逻辑: 1.是否要刷新本地缓存,不需要就直接发起无缓存的网络请求,否则直接读取本地数据 2.需要刷新本地缓存,先读取本地数据,有就返回 ...
- ios中封装网络请求类
#import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...
随机推荐
- NodeJS框架一览
NodeJS 框架一览 Express 当你使用Node.js构建web应用程序时, Express通常被视为事实上的Web服务器.它的哲学(一个可以使用中间件包扩展的简约核心)是大多数Node.js ...
- 乳草的侵占(BFS)
armer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高度 ...
- 使用itop4412开发板单独编译驱动模块
上面我们的驱动是放在了内核源码的目录下来实现的编译成驱动模块,很多时候我们都是拿到一个驱动源码,不需要把他放到内核源码里面,而是直接把他编译成驱动模块,下面我们来讲下实现方法,我们还是以蜂鸣器的驱动为 ...
- JavaScript mixins
mixin 是一个类,该类的方法被添加,混合进另外一个类.一个基础类会包含mixin类的方法而不是继承它.这样你就可以使用不同的mixin类来增加或者增强基础类的功能. 这编内容包含怎么样使用java ...
- CountDownLatch 我的应用场景
记得我是做一个第三方接口,当时需要拿公司的五万辆车通过每周四的夜间去获取违章数据: 三方当时只提供一个只能一辆车去获取未处理的违章数据: 接口是http的方式获取: 当时我是用CountDownLat ...
- gcc -S xx
编译器的核心任务是把C程序翻译成机器的汇编语言(assembly language).汇编语言是人类可以阅读的编程语言,也是相当接近实际机器码的语言.由此导致每种 CPU 架构都有不同的汇编语言. 实 ...
- 最大连续子序列(DP)
Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j < ...
- vim 高级技巧
复制粘贴 normal 或v模式下 y/d/x 复制后,p来粘贴 编辑模式 默认的 set autoindent 会导致粘贴代码会导致缩进混乱 一则可以先关掉autoindent,二则可以先设置set ...
- [ZJOI2019]浙江省选(半平面交)
一眼看上去就应该能用半平面交去做. 首先考虑怎么求可能得第1名的人:每个人的函数为直线,就是在所有人的半平面交中的上边界者即可获得第一名,这个可以单调队列求解. 再考虑如何求可能得第2名的人:满足2个 ...
- 【网络流】Modular Production Line
[网络流]Modular Production Line 焦作上的一道,网络流24题中的原题.... https://nanti.jisuanke.com/t/31715 给出了1e5个点,但是因为最 ...