promise 的 Dialog - daniel-qa/Vue GitHub Wiki

promise 的 Dialog

<template>
    <div>
        <!-- 觸發主流程 -->
        <el-button type="primary" @click="sendMessage">發送</el-button>

        <!-- 確認對話框 -->
        <el-dialog v-model="dialogVisible" title="發送確認" width="400" align-center>
            <div>
                您即將發送訊息,此操作 <strong>不可逆</strong>。請再次確認是否繼續?
            </div>
            <template #footer>
                <el-button @click="cancelConfirm">取消</el-button>
                <el-button type="primary" @click="confirmDialog">我已確認</el-button>
            </template>
        </el-dialog>
    </div>
</template>

<script setup>
    import { ref } from 'vue'
    import { ElMessage } from 'element-plus'

    const dialogVisible = ref(false)

    let dialogResolve, dialogReject

    // 顯示 Dialog 並等待用戶操作
    function waitForConfirm() {

        dialogVisible.value = true

        // 完成點擊,才返回
        return new Promise((resolve, reject) => {
            dialogResolve = resolve
            dialogReject = reject
        })
    }

    // 使用者點「確認」
    function confirmDialog() {
        dialogVisible.value = false
        dialogResolve()  // 繼續後續流程
    }

    // 使用者點「取消」
    function cancelConfirm() {
        dialogVisible.value = false
        dialogReject('使用者取消')
    }

    // 主流程
    async function sendMessage() {
        
        try {
            await waitForConfirm()
            // 使用者已確認
            console.log('✅ 確認後執行發送邏輯')
            ElMessage.success('訊息已送出')
        } catch (err) {
            console.log('❌ 使用者取消發送', err)
            ElMessage.info('已取消發送')
        }
    }
</script>
  • 說明

這裡做了一個綁定,建立了一個通道,在點擊 Dialog 後,可以返回 Promise

dialogResolve = resolve
dialogReject = reject

dialogReject('使用者取消') 裡面填的這段訊息:

'使用者取消'

會被當成 Promise 被拒絕時的錯誤訊息,傳遞到 .catch() 或 try/catch 裡的 catch(err) 裡的 err 變數。

  • 流程

1 . waitForConfirm() → 顯示 dialog → 停在 Promise 中

2 . 使用者點「確認」→ 執行 dialogResolve()

3 . → Promise 解決 → await waitForConfirm() 繼續執行

4 . → 你就可以安全地做「真正的發送訊息」了 ✅

⚠️ **GitHub.com Fallback** ⚠️