用 Proxy 扩展 axios , 让它支持并发控制与出错重试
发布于 8 天前 作者 cnwhy 437 次浏览 来自 分享

最近用 axios 做一个小爬虫项目, 顺带扩展了一下 axios , 支持重试和并发控制.

Proxy 对像拦截所有请求函数, 将请求先插入到一个基于 Promise 队列中
这样的好处是 不用了解修改 axios 内部实现
和用 axios 一毛一样 , 但并发控制和重试机制确生效了.

由于用了 Proxy , 兼容要小心了, 因为没有对应的 polyfill

核心代码很少 :

new Proxy(axios, {
		//拦截 axios(config) 调用
		apply: function(target, thisArg, argumentsList) {
			return run.call(thisArg, target, ...argumentsList);
		},
		get: function(target, property, receiver) {
			let attr = Reflect.get(target, property, receiver);
			//拦截会发起请求的API get post 等
			if (apis.has(property)) {
				return function(...args) {
					return run.call(this, attr, ...args);
				};
			}
			return attr;
		}
	});

己经发到 npm 可以 npm i axios-extra 体验一下;
Github 地址 axios-extra

3 回复

对于异步流控制 rxjs 是杀手锏。 请求的重试,数据的转换变形过滤不要太方便。 看看这个基于 fetchrxjs 的轮子,同时支持浏览器和 Node.js 环境 https://github.com/waitingsong/rxxfetch

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

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

回到顶部