今天研究了一下同事封装的http请求,用的是promise。

大结构是:

 const __fetch = (url, data = {}, config = {}) => {
let params = Object.assign({}, data);
config.headers = Object.assign({}, config.headers, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
config.body = JSON.stringify(params)
return Promise.race([
fetch(url, config),
new Promise((resolve, reject) => {
setTimeout(() => reject({ code: '504', msg: '请求超时' }), config.timeout || 20000)
})
]).then(response => {
if (response.status != 200) {
return Promise.reject({ code: response.status, msg: '请求失败' })
}
return response.json()
}, error => {
if (error && error.code) {
return Promise.reject(error)
}
}).then(response => new Promise((resolve, reject) => {
if (response & response.code && response.code === '000') {
resolve(response.data)
} else {
reject(response)
}
})).catch((e) => {
if (!e || !e.code) return Promise.reject({ code: '999' })
if (parseInt(e.code) === 998) return Promise.reject(e)
return Promise.reject({ code: e.code })
})
}
} const post=(url,data={},config={})=>{
config.method='POST'
return __fetch(url,data,config)
}

知识点:

1.fetch()

此处可与axios做一个对比

axios需要npm install   本质上是对XHR的封装

fetch不需要npm install  ES6本身就支持 直接使用(前提:浏览器支持es6语法)即可 不是对XHR的封装

但是两者都是基于Promise实现的。

axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
}).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});

多说一下:async/await

async 用于声明一个function是异步的,返回一个Promise对象

await可以认为是async wait的简写,表示等待一个一步方法执行完成

async-await是寄生于Promise,Generator的语法糖

try {
let response = await fetch(url); //await在这里表示等待promise返回结果 再继续执行
let data = response.json();
console.log(data);
} catch(e) {
console.log("Oops, error", e);
}

最后说 fetch

fetch(url,options)

options中第一个参数是设置请求方法(默认是get)

第二个参数是设置头部(一般是json,所以设置为application/json)第三个参数是设置包含json内容的主体

fetch('some-url',{
method:'post',
   headers:{'Content-Type':'application/json'},
   body:JSON.stringify(content)
}).then(response=>response.json()) //response.json()是返回另一个promise
.then(data=>console.log(data))
.catch(error=>console.log(error))

2.Promise.race()=>多个异步任务是为了容错

Promise是一个容器,里面保存着未来某个时间点才会结束的操作。

由于fetch暂不支持超时控制,造成了流量的浪费,因此在这里使用Promise.race()对两个promise请求合并。

执行两个异步任务,一个去真实请求,一个超时报错,哪个先返回 获取哪个。

另外一个会继续执行,但是结果会被丢弃

3.job1.then(job2).then(job3).catch(handleError)

有若干个异步任务,需要先做任务1,如果成功后再做任务2,如果成功后再做任务3

任何任务失败则不再继续 并执行错误处理函数。

当promise被明确拒绝,会发生拒绝,但是如果在构造函数回调中引发的错误,会隐式拒绝,因此promise链的尾部必须有个catch接着

之所以需要用两个then,是因为fetch方法不关心ajax是否成功,只关心从服务器发送请求和接受响应。

因此第一个then是看ajax是否成功,第二个then是看具体的错误是什么,因为只有response.json.status才知道具体的错误。

ES6 promise 封装http请求的更多相关文章

  1. React Native 网络请求封装:使用Promise封装fetch请求

    最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...

  2. 微信小程序开发——使用promise封装异步请求

    前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object ...

  3. promise封装微信小程序的request

    1.在utils下创建一个 request.js文件,然后将方法导出 const app = getApp(); //使用promise封装request请求 const POST = (url, p ...

  4. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

  5. 微信小程序ES6方法Promise封装接口

    为何要封装接口? 有小程序开发的经验者,相信对微信API Request很熟悉了.对接接口时,有大部分的开发者都是直接调用request方法,去请求后台接口并渲染数据.诚然,直接使用api发起请求对接 ...

  6. 【前端开发】】ES6属性promise封装js动画

    如下是我写的demo源码: 可以直接复制用浏览器打开看到效果哦: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. 小程序-你不得不知的Promise封装请求

    放在开头 这是一个小程序的轮播图,但是为我们在请求api数据时,将请求wx.request代码封装调用 效果展示 代码篇 页面wxml 这里需要注意的是我们设置swiper和image标签时,有默认属 ...

  8. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  9. jsonp的原理介绍及Promise封装

    什么叫jsonp? jsonp是json with padding(填充式json或参数式json)的简写,是通过ajax请求跨域接口,获取数据的新实现方式 jsonp的实现原理: 动态创建scrip ...

随机推荐

  1. 提高Modelsim仿真速度的方法(1) -- force

    假如主驱动时钟频率很高,因为要一个周期输出,仿真时间过长,仿真速度慢是自然. 但是仿真中,并不是每个驱动周期都是必要的,这时可以使用force命令把想要的信号提前制造出来. 事实上,对于使用到PLL的 ...

  2. 服务安全-JWT(JSON Web Tokens):百科

    ylbtech-服务安全-JWT(JSON Web Tokens):百科 JSON Web Tokens是一种开放的行业标准 RFC 7519方法,用于在双方之间安全地表示索赔. JWT.IO允许您解 ...

  3. JS里面function和Function的区别

    js里Function 与 function的不一样的,不仅仅是大小写的问题. 简单点说:大写的Function是一个类 ,而小写的function是一个对象. Function是一个构造器,func ...

  4. Android之selector选择器的使用

    1.selector简介 selector中文的意思选择器,在Android中常常用来作组件的背景,实现组件在不同状态下不同的背景颜色或图片的变换.使用十分方便.主要是用来改变ListView和But ...

  5. R语言数据预处理

    R语言数据预处理 一.日期时间.字符串的处理 日期 Date: 日期类,年与日 POSIXct: 日期时间类,精确到秒,用数字表示 POSIXlt: 日期时间类,精确到秒,用列表表示 Sys.date ...

  6. Spring MVC(九)--控制器接受对象列表参数

    前一篇文章介绍是传递一个参数列表,列表中的元素为基本类型,其实有时候需要传递多个同一类型的对象,测试也可以使用列表,只是列表中的元素为对象类型. 我模拟的场景是:通过页面按钮触发传递参数的请求,为了简 ...

  7. Linux文件句柄数配置

    1.单程序句柄数限制 查看配置的句柄数:ulimit -n cat /etc/security/limits.conf 参考配置: * soft nofile 655360* hard nofile ...

  8. UDP和TCP的区别?

    区别总结: 1.TCP面向连接,UDP的面向无连接的,即发送数据之前不需要建立简介. 2.TCP提供可靠的数据传输,有发送应答机制,超时重传机制,错误校验机制,流量控制机制保证传输的安全,不丢失,不重 ...

  9. ROCR包中ROC曲线计算是取大于cutoff还是大于等于cutoff

    找到对应的代码如下 .compute.unnormalized.roc.curve function (predictions, labels) { pos.label <- levels(la ...

  10. VS 快捷键和正则替换

    本文在VS2017中可用 1.注释 :Ctrl  K C 取消注释: Ctrl K U 2.整理代码格式: Ctrl K D 或者 Ctrl K F 3.快速切换不同的代码窗口  Ctrl+Tab 4 ...