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

为何JavaScript Promise无法识别变量,仅返回undefined?

问题分析与修正

核心错误原因

  • randNum函数无法返回异步生成的随机数
    setTimeout的回调是异步执行的,你在回调里return num不会让randNum函数拿到这个值——randNum本身没有任何return语句,调用它得到的永远是undefined,这就是控制台输出undefined的直接原因。
  • myPromise中的逻辑时序错误
    你先执行randNum()拿到undefined,再等2秒去判断这个undefined的大小,完全没等到randNum里异步生成的随机数。

修正方案

把randNum改造成返回Promise的函数,这样就能正确获取异步生成的随机数,再在myPromise里基于这个结果触发resolve/reject:

// 改造randNum,返回Promise传递异步结果
function randNum() {
  return new Promise((resolve) => {
    setTimeout(() => {
      let num = Math.random() * 10;
      resolve(num);
    }, 1000);
  });
}

function myPromise() {
  return new Promise((resolve, reject) => {
    // 等待randNum的异步结果返回后再判断
    randNum().then((myNum) => {
      if (myNum > 5) {
        resolve(myNum);
      } else {
        reject(myNum);
      }
    });
  });
}

// 调用测试
myPromise()
  .then((myNum) => { console.log("成功:", myNum); })
  .catch((myNum) => { console.log("失败:", myNum); });

也可以用更简洁的链式调用写法:

function randNum() {
  return new Promise((resolve) => {
    setTimeout(() => resolve(Math.random() * 10), 1000);
  });
}

function myPromise() {
  return randNum().then(num => {
    if (num > 5) return num;
    else throw num; // 抛出错误触发catch
  });
}

myPromise()
  .then(num => console.log("成功:", num))
  .catch(num => console.log("失败:", num));

关键知识点

  • 异步操作的结果不能用普通return返回,必须通过Promise的resolve/reject或者回调函数传递。
  • Promise的核心是处理异步流程,要确保在异步操作完成后再执行后续判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:30:53