1, 简介  

  fetch方法是 Fetch API的一个方法,提供了一种简单、合理的方式来跨网络异步获取资源。

  与原来的XMLHttpRequest比较,fetch更容易与其他的技术结合:比如service workers。还提供了单个逻辑位置来定义其他HTTP相关概念,例如CORS和HTTP的扩展。

  默认情况下fetch不会从服务端接收或发送cookies,如果需要发送则设置credentials选项(默认的credentials为same-origin)。

2,参数

  fetch(url, init={})

     url: 为请求的url路径,  也可以是Request对象(new Request( '请求路径'));

     init: 配置对象,可选的参数有

      • credentials:  能否发送带凭据的请求;  参数为omit、same-origin 或者include
      • headers:请求头, 可以使用对象字面量,也可以使用Headers()构造函数创建一个headers对象。
      • method: 请求方法, get post put delete option等。。
      • cros: 请求是否允许跨域,   参数为 cors、no-cors或same-origin;
      • cache:请求的cache模式, 参数为 default、no-store、reload、no-cache、force-cache或only-if-cached。
      • body:请求主体。 get和head方法不包含body。body可以是以下类型的实例(ArrayBuffer、ArrayBufferView、Blob/File、string、URLSearchParams、FormData), body类包含了以下的方法,可以返回解析后的promise对象和数据(arrayBuffer()、blob() , json() , text() , formData());
      • 等等.....

3,fetch的封装

async function fetch(url, data = {}, method = 'get', way = 'fetch') {
method = method.toUpperCase();
if (method === 'GET') {
let str = '';
Object.keys(data).forEach(item => {
str += `${item}=${data[item]}&`;
});
if (str) {
url = url + '?' + str.slice(0, -1);
}
} if (window.fetch && way === 'fetch') {
let reqInit = {
credentials: 'inclued',
method,
headers: {
'Accept':'application/json',
'Content-Type': 'application/json'
},
mode: 'cors',
cache: 'force-cache'
};
if (method === 'POST') {
Object.assign(reqInit, {
body: JSON.stringify(data)
})
}
try {
const res = await fetch(url, reqInit);
const resJson = res.json();
return resJson;
} catch(e) {
Promise.reject(e);
}
} else {
return new Promise((resolve, reject) => {
let httpReqObj;
if (window.XMLHttpRequest) {
httpReqObj = new XMLHttpRequest();
} else {
httpReqObj = new ActiveXObject('Microsoft.XMLHTTP');
} httpReqObj.open(method, url, true);
httpReqObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReqObj.send(method === 'POST' ? JSON.stringify(data) : null);
httpReqObj.onreadystatechange = () => {
if (httpReqObj.readyState === 4){
if (httpReqObj.status === 200) {
let obj = httpReqObj.response;
if (typeof obj !== 'object') {
obj = JSON.parse(obj);
}
resolve(obj);
} else {
reject(httpReqObj);
}
}
}
})
}
}

  如果不支持fetch或者你不想用fetch, 就改为用xmlhttprequest来发送, 里面的很多参数我都是根据自己项目的需求写死了, 想写的更灵活的小伙伴们可以自行的再封装。

  

  

封装 原生 fetch的更多相关文章

  1. 兼容各版本浏览器,封装原生Js获取ClassName

    web前端开发工作中常常会用到获取元素的className,用jQuery的$(".class")方法也可以获取className,但是有时候牵扯到数据而影响的加载顺序的原因会获取 ...

  2. js 封装原生ajax

    jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只需要ajax,这时引入jquery库会造成资源浪费,也会显得页面臃肿.这时我们就 ...

  3. 结合promise对原生fetch的两个then用法理解

    前言:该问题是由于看到fetch的then方法的使用,产生的疑问,在深入了解并记录对promise的个人理解 首先看一下fetch请求使用案例: 案例效果:点击页面按钮,请求当前目录下的arr.txt ...

  4. php 封装原生数据导入的方法(csv文件格式)

    //前端---部分代码 <form class="form-inline" style="margin-top: 20px" method="p ...

  5. 【转】封装原生JS实现Ajax

    function createXHR() { if (window.XMLHttpRequest) { //IE7+.Firefox.Opera.Chrome 和Safari return new X ...

  6. javascript - 封装原生js实现ajax

    1 /* * ajax方法 */ var Ajax = function() { var that = this; //创建异步请求对象方法 that.createXHR = function() { ...

  7. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  8. vue实践---vue结合 promise 封装原生ajax

    有时候不想使用axios这样的外部依赖,想自己封装ajax,这里有两种方法 方法一,在单个页面内使用 封装的代码如下: beforeCreate () { this.$http = (() => ...

  9. 原生ajax解析&封装原生ajax函数

    前沿:对于此篇随笔,完是简要写了几个重要的地方,具体实现细节完在提供的源码做了笔记 <一>ajax基本要点介绍--更好的介绍ajax 1. ajax对象中new XMLHttpReques ...

随机推荐

  1. 基于swoole搭建聊天室程序

    1. 创建websocket服务器 swoole从1.7.9版本开始, 内置了websocket服务器功能,我们只需几行简单的PHP代码,就可以创建出一个异步非阻塞多进程的WebSocket服务器. ...

  2. 怎样将word中的图片插入到CSDN博客中

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  3. PHP(十二)文件操作

  4. swipe.js 使用方法

    1.插件要求的css样式: <style> .swipe { overflow: hidden; visibility: hidden; position: relative; } .sw ...

  5. CodeForces - 669D——(思维题)

    Little Artem is fond of dancing. Most of all dances Artem likes rueda — Cuban dance that is danced b ...

  6. 使用Hbuilder将自己app发布到App Store(一)

    1.如果你有mac系统那请看第二步. 首先需要一台虚拟机,还需要个插件要不没法装,都在这链接里面了 链接:https://pan.baidu.com/s/1N_pWJWFk-EJILTXuFr6w5g ...

  7. stack和stack frame

    首先,我们先来了解下栈帧和栈的基本知识: 栈帧也常被称为“活动记录”(activation record),是编译器用来实现过程/函数调用的一种数据结构. 从逻辑上讲,栈帧就是一个函数执行的环境,包含 ...

  8. JS 面向对象详解

    面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  9. sql server中的 trimtrailingblanks

    使用sp_help 查出 发现有个这个属性, 如何修改呢? SET ANSI_PADDING ONAlter Table Sys_users_History Alter   column PveSit ...

  10. “全栈2019”Java多线程第三章:创建多线程之实现Runnable接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...