用 Proxy 扩展 axios , 让它支持并发控制与出错重试
发布于 6 个月前 作者 cnwhy 996 次浏览 最后一次编辑是 5 个月前 来自 分享

最近用 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 是杀手锏。 请求的重试,数据的转换变形过滤不要太方便。 看看这个基于 fetchrxjs 的轮子,同时支持浏览器和 Node.js 环境 https://github.com/waitingsong/rxxfetch

@waitingsong 始终觉得 fetch 不支持进度是硬伤, 所以一直没怎么用过它

@cnwhy 应该会加上的。毕竟是浏览器xhr新标准

回到顶部