await 是 Promise 的語法糖 - daniel-qa/Vue GitHub Wiki

await 是 Promise 的語法糖

結論: 簡單情境,用 await 就好。

你可以只選一種用:await 或 Promise.then(),但不能混用不當。

解釋一下:

1. await 是 Promise 的語法糖

其實它們本質上是一樣的東西,只是語法不同、可讀性不同:

  • 使用 await(建議在 async 函式內使用)
async function sendMessage() {
    const result = await doSomethingAsync();
    console.log(result);
}
  • 使用 .then()(回調方式)
function sendMessage() {
    doSomethingAsync().then(result => {
        console.log(result);
    });
}

可以混用,但要小心這些狀況: ❌ 不建議這樣寫(混得亂會讓程式難讀)

await doSomethingAsync().then(result => {
    console.log(result); // ⚠️ 這樣多此一舉
});

你已經用 await 了,就不需要再 .then()。

正確原則

你想要達成的目標 使用方式 建議與說明
結構清晰、易讀的非同步邏輯 async/await ✅ 最推薦,現代開發主流寫法
快速撰寫簡單的鏈式非同步處理 .then() 可接受,屬於較舊的 JS 風格
等待某個 Promise 完成後再執行動作 await ✅ 最直覺的等待方式,搭配 async 使用
  • promise 的一般用法
function askUser() {
  return new Promise((resolve, reject) => {
    // 模擬使用者按了「取消」
    reject("使用者取消了操作");
  });
}

async function run() {
  try {
    await askUser();  // 👈 這裡會被 reject 中斷
    console.log("使用者確認了");
  } catch (err) {
    console.log("進入 catch:", err); // ✅ 被 reject 觸發
  }
}

run();

  • 物件包含函式的用法
langDialogHandlers.value = {
    onConfirm: () => {
        resolve(); // ✅ 成功
        sendLangDialogVisible.value = false;
    },
    onCancel: () => {
        reject();  // ✅ 中止(會進 catch)
        sendLangDialogVisible.value = false;
    }
};

它的型態就是一個「物件包含函式」的結構,用來:

把 Dialog 的按鈕點擊事件跟外部的 resolve() / reject() 綁起來。

讓 Dialog 裡面的 < el-button @click="langDialogHandlers.onConfirm()" /> 可以控制 Promise 的完成或中止。


什麼情況才考慮用 .then()?

你不在 async function 裡(不能用 await)

想快速鏈式處理(例如 fetch().then(...).catch(...))

或是為了兼容舊寫法