用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 的解析 ... 
随机推荐
- spring hystrix和内置tomcat组件的参数调优解析
			1. springboot内置tomcat容器的参数配置 server: port: 12021 # server端的socket超时间(毫秒),使用值-1表示没有(即无限)超时,默认值为60000( ... 
- Scanner方式输入小写字母转换成大写字母
			import java.util.Scanner; /** * 小写字母转换成大写字母 * @author zzu119 * */ public class letterTransfe ... 
- Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍
			题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ... 
- Maven--优化依赖
			Maven 会自动解析所有项目的直接依赖和传递依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在.在这些工作之后,最后得到的那些依赖 ... 
- webpack--删除dist目录
			1.安装clean-webpack-plugin插件 npm install clean-webpack-plugin --D 2.在webpack.dev.conf.js或者webpack.conf ... 
- sbt 设置
			修改 sbtopts for shell # zkk -sbt-dir D:/DATA/.sbt -sbt-boot D:/DATA/.sbt/boot -ivy D:/DATA/.ivy2 修改 s ... 
- EnableAutoConfiguration注解 Spring中@Import注解的作用和使用
			EnableAutoConfiguration注解 http://www.51gjie.com/javaweb/1046.html springboot@EnableAutoConfiguration ... 
- urlopen error [errno 10060]的解决思路
			当用多线程爬取某个网站的数据的时候,爬取一段时间后,总出现urlopen error [errno 10060]的错误,结果线程无端的被挂掉,一开始的解决思路是每次连接的时候换用不同的useragen ... 
- TPO2-1Desert Formation
			The extreme seriousness of desertification results from the vast areas of land and the tremendous nu ... 
- python基础——散列类型
			集合 集合具有不重复性,无序性的可变对象. 集合定义 直接定义 如:a = {'a','b',2} 别的类型转换,利用set a = set(b) 其中b可以是一个列表或字符串等 增 add ... 
