封装fetch时遇到的逻辑问题,和Vuex/Pinia形成循环引用如何解决?

小型vue项目,使用ajax的需要较为简单。
所以使用了原生的fetch来发送请求,但是在做自动附带Token时遇见问题。
如:Token存在Vuex/Pinia中,我封装的fetch文件中需要拿到Pinia中的Token,而Pinia中会包含使用fetch发送请求的异步方法。
这就形成了
封装的fetch文件 引用 Pinia的模块文件 来获取Token

../../httpHelper.js
import {useAppStroe} from '/@/store/module/app'
const appStore = useAppStore()
export function sendHttp(apiName,params,callback){
  // 接口特殊,token存在body中  
  params.token = stroe.getToken;
  let baseUrl = 'xxxx' + apiName;
  fetch(baseUrl, { method: 'post', body: params }).then((res) => {
  ...
  });
}

Vuex的模块文件 引用 封装的fetch文件 来发送请求

../../app.js
import { defineStore } from 'pinia'
import { sendHttp } from '/@/utils/httpHelper'
export const useAppStore = defineStore({
    state:()=>({
        Token:''
    }),
    getter:{
        getToken(state) {
            return state.Token || '';
        },
    },
    actions:{
        setToken(token: string) {
            this.Token = token;
        },
        login(){
            ...
            sendHttp('login',{},()=>{})
        }
    }
})

循环引用,导致错误。如何解决?
axios是如何解决这种循环引用的问题呢?

阅读 2.9k
2 个回答
✓ 已被采纳

暂时有了解决方法,将useAppStore的使用放在sendHttp方法内部
好处:解决了循环引用
坏处:每一次发送请求变使用了一次useAppStore,可能会照成资源浪费

function sendHttp(){
    const appStore = useAppStore()
    ...
}

再弄个文件,把token的管理代码放进去,别的模块里面调用对应方法来读取token

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题