From 4ebf7a59d5f0992dd00f09df88c150b0195f630d Mon Sep 17 00:00:00 2001 From: Yesol Choi Date: Thu, 29 May 2025 23:59:37 +0900 Subject: [PATCH] =?UTF-8?q?com=20:=20selectCode=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=EC=A7=80=EC=97=B0=20=EC=9D=B4=EC=8A=88=20Promise=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EB=B0=9B=EC=95=84=EC=84=9C=201=EB=B2=88?= =?UTF-8?q?=EB=A7=8C=20=ED=98=B8=EC=B6=9C=EB=90=98=EA=B2=8C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/app-vuero/VCodeSelect.vue | 5 +++-- src/stores/codeStore.ts | 20 +++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/components/app-vuero/VCodeSelect.vue b/src/components/app-vuero/VCodeSelect.vue index 233d023..b3e97ba 100644 --- a/src/components/app-vuero/VCodeSelect.vue +++ b/src/components/app-vuero/VCodeSelect.vue @@ -47,12 +47,13 @@ const classes = computed(() => { return ['select', props.multiple && 'is-multiple'] }) -const cdItems = ref>([]) +const cdItems = computed(() => { + return detailCode.getCodeList(props.cd_grp) +}) watch(() => props.cd_grp, async (newVal) => { if (newVal) { await detailCode.setDetailCode(newVal) - cdItems.value = detailCode.getCodeList(newVal) } }, { immediate: true }) diff --git a/src/stores/codeStore.ts b/src/stores/codeStore.ts index c26d058..2af784f 100644 --- a/src/stores/codeStore.ts +++ b/src/stores/codeStore.ts @@ -1,17 +1,27 @@ import { acceptHMRUpdate, defineStore } from 'pinia' -import { useStorage } from '@vueuse/core' import { getDetailCode } from '/@src/service/code' export const useCodes = defineStore('codeStore', () => { // 🟡 상태 const codes = ref>>({}) - // 🔵 액션: 코드 불러오기 + const loadingPromises = new Map>() + const setDetailCode = async (cd_grp: number) => { - if (!codes.value[cd_grp]) { - const res = await getDetailCode(cd_grp) - codes.value[cd_grp] = res + if (codes.value[cd_grp] && codes.value[cd_grp].length > 0) return + + if (loadingPromises.has(cd_grp)) { + return loadingPromises.get(cd_grp) } + + const p = getDetailCode(cd_grp).then((res) => { + codes.value[cd_grp] = res + }).finally(() => { + loadingPromises.delete(cd_grp) + }) + + loadingPromises.set(cd_grp, p) + return p } // 🟢 코드 목록 가져오기