await返回之后的赋值给一个变量可以打印出数值,但是直接return回去之后,在另一个函数打印出来却是一个promise

🧪 现象描述

你说:

await 返回之后赋值给一个变量可以打印出数值,但是 return 回去之后,在另一个函数打印出来却是一个 Promise

这是完全正常的,原因在于:使用了 await 的函数本身返回的是一个 Promise


🔍 示例说明

示例 1:你在 async 函数中用 await

javascript 复制代码
js
深色版本
async function getData() {
  const res = await fetchSomeData(); // 假设 fetchSomeData 返回一个 Promise
  console.log(res); // 这里能正常输出数据,比如 "Hello"
  return res;       // 注意这里 return 的值会被包装成 Promise
}

当你调用这个函数时:

ini 复制代码
js
深色版本
const result = getData();
console.log(result); // 输出: Promise { <pending> }

为什么会这样?

➡️ 因为 只要是 async 函数,它的返回值永远是一个 Promise


✅ 如何获取 async 函数返回的真实值?

你需要再用 .then() 或者在另一个 async 函数中用 await 来取值。

方法一:用 .then

ini 复制代码
js
深色版本
getData().then(data => {
  console.log(data); // 这里才是真正的数据,比如 "Hello"
});

方法二:在另一个 async 函数中用 await

javascript 复制代码
js
深色版本
async function useData() {
  const data = await getData();
  console.log(data); // 这里才是真正的数据
}

📌 关键点总结

内容 说明
await 的作用 暂停当前异步函数执行,直到 Promise resolve,并取出其值
async 函数的返回值 永远是一个 Promise,即使你 return 123,也会变成 Promise.resolve(123)
如果直接 return res 其实就是把 res 包装成一个 resolved 的 Promise
所以你看到的 Promise 是正常的 你需要继续用 .then()await 取出里面的值

🧠 举个完整例子

javascript 复制代码
js
深色版本
function fetchSomeData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Hello"), 1000);
  });
}

async function getData() {
  const res = await fetchSomeData();
  return res; // 相当于 Promise.resolve("Hello")
}

// ❌ 错误方式:直接打印 async 函数结果
console.log(getData()); // Promise { <pending> }

// ✅ 正确方式 1:用 .then()
getData().then(data => console.log(data)); // 输出 Hello

// ✅ 正确方式 2:在 async 函数中 await
async function main() {
  const data = await getData();
  console.log(data); // 输出 Hello
}

main();

🚫 常见误区

  • ❌ 认为 return res 就可以直接拿到原始值
  • ❌ 在外部试图同步访问异步函数的结果(这不可能)

✅ 最佳实践建议

  • 使用 async/await 时,始终保持"链式异步",不要试图"同步化"异步操作。
  • 如果你在某个函数中用了 await,那这个函数应该也标记为 async
  • 要想拿到最终值,必须通过 .then() 或嵌套的 await
相关推荐
Spider_Man20 分钟前
打造属于你的前端沙盒 🎉
前端·typescript·github
用户479492835691522 分钟前
🤫 你不知道的 JavaScript:`"👦🏻".length` 竟然不是 1?
前端·javascript·面试
掘金一周24 分钟前
凌晨零点,一个TODO,差点把我们整个部门抬走 | 掘金一周 9.11
前端·人工智能·后端
用户81744134274827 分钟前
kubernetes核心概念 Service
前端
东北南西35 分钟前
Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
前端·javascript
Zz_waiting.37 分钟前
案例开发 - 日程管理 - 第六期
前端·javascript·vue.js·路由·router
袁煦丞44 分钟前
企业微信开发者的‘跨网穿梭门’:cpolar内网穿透实验室第499个成功挑战
前端·程序员·远程工作
Simon_He1 小时前
vue-markdown-renderer:比 vercel streamdown 更低 CPU、更多节点支持、真正的流式渲染体验
前端·vue.js·markdown
小桥风满袖1 小时前
极简三分钟ES6 - 模块化
前端·javascript
练习时长一年1 小时前
自定义事件发布器
java·前端·数据库