You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用async/await后Promise仍返回undefined?变量传值差异解惑

问题原因分析

核心问题出在变量赋值时机与resolve执行时机的先后顺序上:

当你将赋值为materias[mat]的变量mater传给resolve时,resolve执行的时间早于mater被正确赋值的时间,此时mater还处于未定义或undefined状态,导致Promise最终返回undefined;而直接传入materias[mat]时,是在resolve执行的当下立即计算并传入对应数组元素,此时下标mat是有效的,所以能返回正确结果。

举个具体的错误代码示例(模拟常见的异步赋值场景):

const materias = [{id: 1, name: "代数"}, {id: 2, name: "物理"}];

async function encontrarMateria(mat) {
  return new Promise((resolve) => {
    let mater;
    // 模拟异步赋值操作(比如调用API、定时器等)
    setTimeout(() => {
      mater = materias[mat];
    }, 0);
    // 这里resolve先执行,mater还没被赋值,是undefined
    resolve(mater);
  });
}

// 调用后会输出undefined
(async () => {
  console.log(await encontrarMateria(0));
})();

如果改成直接传入materias[mat],就能正常返回:

async function encontrarMateria(mat) {
  return new Promise((resolve) => {
    // 立即获取当下mat对应的元素并传入resolve
    resolve(materias[mat]);
  });
}

如果必须通过变量mater传递,要确保赋值完成后再调用resolve:

async function encontrarMateria(mat) {
  return new Promise((resolve) => {
    setTimeout(() => {
      const mater = materias[mat];
      // 赋值完成后再执行resolve
      resolve(mater);
    }, 0);
  });
}

补充说明:async/await只是用来简化Promise的异步流程处理,它不会改变Promise内部代码的执行顺序,所以即使加了async/await,只要内部resolve的时机不对,依然会出现返回undefined的问题。

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:48:30