发布观察者模式使用场景记录

1. 全局共享的数组请求

问题

当遇到全局共享的字典list挂载到vuex或者pinia等全局状态中供全局组件使用,但字典接口后端设置了token请求,如果是在没token进入时候就会遇到这样的情况

在App.vue组件中

js 复制代码
<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>

export default {
  name: "App",
  created() {
    if(getToken()){
        this.$store.dispatch("getXXXList");
        this.$store.dispatch("getXXXList");
    }else{
        observer.add(getXXXList,this.$store)
    }
  },
  metaInfo() {
    
  },
};
</script>
<style scoped>

</style>

这样组件出时候加载就会发起两个请求,但是因为没有token弹出以上提示。

解决思路

可以使用发布订阅者模式,初始化时收集该类型的请求,等到有token时候(可以在登陆时候触发,也可以监听某个参数触发)执行该收集的列表。可以直接使用全局状态管理实现。

js 复制代码
//观察器

class Observer {
  constructor() {
    this.observers = [];
    this.store = null;
  }

  add(observer, store) {
    this.observers.push(observer);
    this.store = store;
  }
  notify() {
    if (!this.store) {
      console.error("Observer: store is not set");
      return;
    }
    console.log(this.store);

    this.observers.forEach((item) => {
      this.store.dispatch(item);
    });
    this.observers = [];
  }
}
const observer = new Observer();
export default observer;

最后在登陆时候notify就可以。这是单一场景下,如果涉及到其他 的主题需要添加分类

相关推荐
xiaolyuh1238 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
GISer_Jing19 小时前
智能体工具使用、规划模式
人工智能·设计模式·prompt·aigc
GISer_Jing19 小时前
AI Agent:学习与适应、模型上下文协议
人工智能·学习·设计模式·aigc
小马爱打代码21 小时前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式
月明长歌21 小时前
Javasynchronized 原理拆解:锁升级链路 + JVM 优化 + CAS 与 ABA 问题(完整整合版)
java·开发语言·jvm·安全·设计模式
会员果汁21 小时前
12.设计模式-状态模式
设计模式·状态模式
Yu_Lijing1 天前
基于C++的《Head First设计模式》笔记——抽象工厂模式
c++·笔记·设计模式
会员果汁1 天前
13.设计模式-适配器模式
设计模式·适配器模式
GISer_Jing2 天前
AI:多智能体协作与记忆管理
人工智能·设计模式·aigc
雨中飘荡的记忆2 天前
责任链模式实战应用:从理论到生产实践
设计模式