调用async异步函数无法获取resolved的返回值问题求助
问题原因
所有被async关键字修饰的函数,默认返回值都是Promise对象。你当前的写法将.then()的返回值直接赋值给userID变量,而.then()方法本身也会返回Promise实例,因此你拿到的始终是Promise对象而非异步请求返回的实际值。
同时JS异步代码不会阻塞同步代码的执行,你执行赋值操作时,getCurrentUserId内部的网络请求还未完成,Promise还处于pending状态,自然无法拿到最终结果。
解决方案
有两种常用的方式可以获取异步函数的返回值:
- 第一种:使用
await语法(推荐)await只能在被async修饰的函数内部使用,它会等待Promise状态变为resolved后直接返回结果值:// 需要将逻辑放在async修饰的函数中 async function handleUserInfo() { const userID = await Reddit.getCurrentUserId(); // 所有需要用到userID的逻辑都可以写在这里 console.log(userID); } handleUserInfo(); - 第二种:在
.then()回调内部处理逻辑
你无法将.then()回调的返回值拿到外层同步代码中使用,所有依赖userID的逻辑都需要放在回调函数内部:Reddit.getCurrentUserId().then(userID => { // 所有需要用到userID的逻辑都放在这个回调内 console.log(userID); })
额外优化建议
你原有代码中的冗余逻辑可以简化:
- 代码中
const token = await Reddit.getAccessToken().then(val => {return val;})可以直接简化为const token = await Reddit.getAccessToken(),await本身就会自动获取Promise resolve后的值,不需要额外加.then()返回 - 建议补充错误处理逻辑,避免请求失败导致程序报错:
// await 搭配 try...catch 捕获异常 async function handleUserInfo() { try { const userID = await Reddit.getCurrentUserId(); console.log(userID); } catch (err) { console.error('获取用户ID失败:', err); } }
内容的提问来源于stack exchange,提问作者Davy Kamanzi
相关产品推荐
相关产品推荐

