简单的发布-订阅模式
const eventNames = ["API:UN_AUTH", "API:INVALID_TOKEN","UI:OPEN_MESSAGE","UI:OPEN_MODAL" ,"..."] as const;
type EventName = (typeof eventNames)[number];
class EventEmitter {
private listeners: Record<EventName, Set<Function>> = {
"API:UN_AUTH": new Set(),
"API:INVALID_TOKEN": new Set(),
};
on(eventNames: EventName, listener: Function) {
this.listeners[eventNames].add(listener);
}
emit(eventNames: EventName, ...args: any[]) {
this.listeners[eventNames].forEach((cb) => cb(...args));
}
}
export default new EventEmitter();
在http请求响应拦截里使用发布事件:
async (error: any) => {
const data = error?.response?.data
if (data && data.code === 60009) {
emit()
}
if (data && data.code === 60010) {
EventEmitter.emit('UI:OPEN_MESSAGE',...)
}
if (axios.isCancel(error)) return
if (error.response.status === 401) {
EventEmitter.emit('API:UN_AUTH')
}
if (data && (data.code ===1||data.code===50002)) {
EventEmitter.emit('UI:OPEN_MESSAGE',...)
}
if (data && data.code !== 60009&&data.code !== 60010) {
EventEmitter.emit('UI:OPEN_MODAL',...)
}
。。。
return Promise.reject(error.response)
}
在router.js、uiUtils.js里使用订阅事件
//router.js
import eventEmitter from '@utils/EventEmitter'
...
eventEmitter.on('API:UN_AUTH',()=>{
router.push('/login')
})
...
//uiUtils.js
import eventEmitter from '@utils/EventEmitter'
import {message,Modal} from 'ant-design-vue'
...
eventEmitter.on('UI:OPEN_MESSAGE',(...args)=>{
message.wran({
...
})
})
eventEmitter.on('UI:OPEN_MODAL',(...args)=>{
Modal.wran({
...
})
})
...

浙公网安备 33010602011771号