封装XMLHttpRequest对象拦截方法#
function proxyRequest() {
const _xhr = window.XMLHttpRequest;
const proxies = [];
const events = {};
const cache = { _this: null, _xhr: null };
window.XMLHttpRequest = function () {
cache._xhr = new _xhr();
proxies.forEach((func) => {
try {
func(cache._xhr);
} catch (e) {}
});
Object.keys(events).forEach((name) => {
events[name].forEach((proxy) => {
cache._xhr.addEventListener(name, (evt) =>
proxy?.func(evt, cache._xhr)
);
});
});
return cache._xhr;
};
return new chain();
function use(func) {
proxies.push(func);
return cache._this;
}
function on(name, func) {
events[name] = [...(events[name] || []), { name, func }];
return cache._this;
}
function load(func) {
return cache._this.on("load", (evt) => {
const text = cache._xhr?.responseText;
func(toJSON(text) || text, evt, cache._xhr);
});
}
function chain() {
cache._this = this;
this.proxies = proxies;
this.events = events;
this.use = use;
this.on = on;
this.load = load;
}
function toJSON(text) {
try {
return JSON.parse(text);
} catch (e) {
return null;
}
}
}
const instance = proxyRequest();
instance.use((xhr) => {
xhr.addEventListener("load", () => {
console.log(JSON.parse(xhr.responseText)
});
});
instance.on("load", (evt, xhr) => {
console.log(JSON.parse(xhr.responseText)
});
instance.load((data, evt, xhr) => {
console.log(data);
});
封装Fetch对象拦截方法#
function proxyFetch() {
let _this = null;
const _fetch = window.fetch;
const proxies = [];
window.fetch = function (...args) {
const res = _fetch(...args);
res.then((res) => {
proxies.forEach((func) => {
try {
func(res.clone());
} catch (e) {}
});
});
return res;
};
return new chain();
function chain() {
_this = this;
this.proxies = [];
this.use = use;
}
function use(func) {
proxies.push(func);
return _this;
}
}
const fetchInstance = proxyFetch();
fetchInstance.use(async (res) => {
console.log(await res.json());
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通