
异步函数(如 async 声明的 getTranslation)默认返回 Promise 对象,不能直接通过赋值获取最终值;必须使用 await(在 async 上下文中)或 .then()(链式调用)来提取解析后的结果。
异步函数(如 `async` 声明的 `gettranslation`)默认返回 promise 对象,不能直接通过赋值获取最终值;必须使用 `await`(在 async 上下文中)或 `.then()`(链式调用)来提取解析后的结果。
在构建基于 Google Cloud Translation API 的翻译应用时,一个常见误区是误以为 async 函数会“同步”返回解析后的值。实际上,async function 总是隐式返回一个 Promise —— 即使你 return "Hello walt",实际返回的是 Promise.resolve("Hello walt"),而非字符串本身。
以下是你原始代码的问题核心:
const message = getTranslation(text); // ❌ 返回 Promise,不是翻译文本
console.log(message); // → Promise {<pending>}</pending>
✅ 正确做法有三种,适用于不同场景:
1. 使用 .then() 处理 Promise(适合顶层非 async 环境)
let text = "hello world";
const { getTranslation } = apiTranslate;
getTranslation(text)
.then(translation => {
console.log(translation); // ✅ 输出 "Hello walt"
// 在此处继续处理 translation,例如更新 DOM 或存入状态
})
.catch(err => console.error("翻译失败:", err));
2. 使用 await(需在 async 函数内)
const doTranslate = async () => {
const text = "hello world";
const { getTranslation } = apiTranslate;
try {
const message = await getTranslation(text); // ✅ 等待 Promise 解析
console.log(message); // "Hello walt"
return message; // 可供上层 await 使用
} catch (err) {
console.error("API 调用异常:", err.response?.data || err.message);
}
};
// 调用方式
doTranslate();
3. IIFE(立即执行异步函数)—— 快速验证逻辑
(async () => {
const text = "hello world";
const { getTranslation } = apiTranslate;
try {
const translation = await getTranslation(text);
console.log("翻译结果:", translation); // ✅
} catch (error) {
console.warn("请求失败,请检查 API Key 和网络连接");
}
})();
⚠️ 重要注意事项:
-
await只能在async函数内部使用,不能直接写在模块顶层(ESM)或普通脚本最外层(除非用 IIFE 包裹); - 忽略错误处理可能导致静默失败,务必用
try...catch或.catch()捕获网络错误、400/403 响应等; - Google Translation API v2 需启用对应服务并确保
_API_KEY具备Cloud Translation API权限,且请求体结构正确(注意q是数组才支持多文本,单文本可直接传字符串); - 生产环境建议封装统一错误提示、加载状态与重试机制。
总结:异步 ≠ 同步取值。牢记 “async 函数返回 Promise,消费它必须 await 或 .then()”,这是 JavaScript 异步编程的基石,也是避免 undefined 或 Promise {<pending>}</pending> 陷阱的关键。










