custom-request
v0.0.5
Published
custom restful api use axios or fetch
Downloads
7
Readme
custom-request
定制处理数据请求,基于 axios(XHR)、isomorphic-fetch(Fetch),两种方式自选
- 推荐(默认 fetch)简单封装fetch 输出为 request
import request from 'custom-request'
- request 用法参见 fetch.test.js
- 底层引用 isomorphic-fetch
- 浏览器端实际使用的 whatwg-fetch 见文档
- Fetch 规范
- Fetch API - Web APIs | MDN
- 你也可以用选择使用axios
import { axios } from 'custom-request'
TODO:
- 对以上功能封装,暴露统一的 API,方便使用
- 需要支持引入 cache-store 机制,支持自定义API 的缓存时长,并支持后台更新缓存
功能封装
封装差异性,统一传入参数的格式及使用方法暴露唯一的一个方法即可(包含get post delete 等常用方法)
以下是关于 fetch 的一些常见问题
Fetch API提供了一个获取资源的接口(包括跨网络)。任何使用过
XMLHttpRequest
的人都会熟悉它,但是新的API提供了更强大和更灵活的功能集。
Fetch 常见坑
- Fetch 请求默认是不带 cookie 的,需要设置
fetch(url, {credentials: 'include'})
- 服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
- IE 使用策略
- 所有版本的 IE 均不支持原生 Fetch,fetch-ie8 会自动使用 XHR 做 polyfill。但在跨域时有个问题需要处理。
- IE8, 9 的 XHR 不支持 CORS 跨域,虽然提供
XDomainRequest
,但这个东西就是玩具,不支持传 Cookie!如果接口需要权限验证,还是乖乖地使用 jsonp 吧,推荐使用fetch-jsonp
。
标准 Promise 的不足
由于 Fetch 是典型的异步场景,所以大部分遇到的问题不是 Fetch 的,其实是 Promise 的。ES6 的 Promise 是基于 Promises/A+ 标准,为了保持简单简洁,只提供极简的几个 API。如果你用过一些牛 X 的异步库,如 jQuery(不要笑) 、Q.js 或者 RSVP.js,可能会感觉 Promise 功能太少了。
没有 Deferred
Deferred 可以在创建 Promise 时可以减少一层嵌套,还有就是跨方法使用时很方便。 ECMAScript 11 年就有过 Deferred 提案,但后来没被接受。其实用 Promise 不到十行代码就能实现 Deferred:es6-deferred。现在有了 async/await,generator/yield 后,deferred 就没有使用价值了。
没有获取状态方法:isRejected,isResolved
标准 Promise 没有提供获取当前状态 rejected 或者 resolved 的方法。只允许外部传入成功或失败后的回调。我认为这其实是优点,这是一种声明式的接口,更简单。
缺少其它一些方法:always,progress,finally
always 可以通过在 then 和 catch 里重复调用方法实现。finally 也类似。progress 这种进度通知的功能还没有用过,暂不知道如何替代。