【轮子】rf -- 一个基于 Fetch 的请求库

rf -- request base on Fetch,就是一个基于 Fetch 的请求库。

现在,浏览器的发展使得我们可以使用 es 的一些新特性,而无需考虑到兼容性的问题。比如 promise,之前还是需要引用 polyfill 才行,但现在基本上每个浏览器都已经支持了。这使得我们可以写更少更简洁的代码。

在之前,发送 ajax 请求时,我们会对 XMLHTTPRequest 进行一层封装,使得支持 promise 形式的调用,类似这样:

function request() {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHTTPRequest();
    ...
    xhr.onload = () => {
      if (xhr.status === 200 || xhr.status < 300) {
        resolve();
      } else {
        reject()
      }
    }
  });
}
复制代码

现在,我们可以直接使用 Fetch 来发送请求,无需额外的进行代码封装。

fetch("/some-spi")
  .then(response => response.json())
  .then(data => console.log(data));
复制代码

Fetch 提供了一个更好的替代方法,而且这也很容易被其他技术使用,例如 Service Workers。但其提供的全局 fetch()方法, 跟 ajax 还是有一些区别的。如

1.当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。

2.默认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项)。

所以,如果我们直接使用 fetch 方法的时候,没有进行额外的封装处理的话,那么业务代码每个进行请求的时候,都要去判断一下返回的是否 ok。这会使得我们的代码很冗余。这就是为什么需要有 rf 的出现了。r2 其实已经对 fetch 进行了一层的封装,我写 rf 时也是参考了这个库的代码实现,但还是有一些不同的,如

  • 使用 ts 实现
  • 当 HTTP 响应错误的状态码,会将 Promise 标记为 reject
  • 支持 timeout

github 地址 github.com/liuhanqu/re…,欢迎提意见,觉得还行就顺便给个赞呗哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用axios或node-fetch时,你可以封装一个常用的请求函数来简化代码和提高可重用性。以下是一个使用axios或node-fetch封装请求的示例: 使用axios封装请求的示例: ```javascript const axios = require('axios'); async function sendRequest(url, method, data) { try { const response = await axios({ method: method, url: url, data: data }); return response.data; } catch (error) { throw new Error(error.message); } } // 使用示例 sendRequest('https://api.example.com/users', 'GET') .then(data => { console.log(data); }) .catch(error => { console.error(error); }); ``` 使用node-fetch封装请求的示例: ```javascript const fetch = require('node-fetch'); async function sendRequest(url, method, data) { try { const response = await fetch(url, { method: method, body: JSON.stringify(data), headers: { 'Content-Type': 'application/json' } }); const responseData = await response.json(); return responseData; } catch (error) { throw new Error(error.message); } } // 使用示例 sendRequest('https://api.example.com/users', 'GET') .then(data => { console.log(data); }) .catch(error => { console.error(error); }); ``` 在上述示例中,我们封装了一个名为`sendRequest`的函数,该函数接受三个参数:URL、请求方法(GET、POST等)和请求数据(可选)。函数内部使用了axios或node-fetch来发送请求,并处理返回的响应数据。如果请求出现错误,将抛出一个包含错误消息的异常。 你可以根据自己的需求进一步扩展和定制这个封装函数,例如添加请求头、处理其他类型的响应数据等。 希望这个示例对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值