用 Proxy 扩展 axios , 让它支持并发控制与出错重试
最近用 axios
做一个小爬虫项目, 顺带扩展了一下 axios
, 支持重试和并发控制.
用 Proxy
对像拦截所有请求函数, 将请求先插入到一个基于 Promise
队列中
这样的好处是 不用了解修改 axios
内部实现
由于用了
Proxy
, 兼容要小心了, 因为没有对应的 polyfill
和使用 axios
一毛一样 , 但并发控制和重试机制确生效了.
const axios = require('axios-extra'); //默认最大并发 10, 重试 0;
axios.defaults.maxConcurrent = 1; //修改axios`并发为1
// 创建一个 axios1 并发为2, 自动重试为3的 axios;
let axios1 = axios.create({
maxConcurrent: 2,
queueOptions: { retry:3 }
});
for(let i=0; i<10; i++){
axios.get('https://cnodejs.org/api/v1/topics').then((res)=>{
console.log( 'axios1', i , res.data.data.length);
});
axios1.get('https://cnodejs.org/api/v1/topics').then((res)=>{
console.log( 'axios1', i , res.data.data.length);
})
}
己经发到 npm 可以 npm i axios-extra
体验一下;
Github 地址 axios-extra
3 回复
对于异步流控制 rxjs
是杀手锏。 请求的重试,数据的转换变形过滤不要太方便。
看看这个基于 fetch
和 rxjs
的轮子,同时支持浏览器和 Node.js
环境
https://github.com/waitingsong/rxxfetch
@waitingsong 始终觉得 fetch 不支持进度是硬伤, 所以一直没怎么用过它
@cnwhy 应该会加上的。毕竟是浏览器xhr新标准