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

如何在setTimeout完成后通过.then返回Promise?代码报错求助

问题排查:基于Promise的延迟加法函数报错处理

错误原因分析

你遇到的TypeError: Cannot read properties of undefined (reading 'then')错误,核心有三个问题:

  1. addPromise未返回Promise实例:函数内部调用了delayedPromise().then(...)但没有return这个链式调用的结果,导致addPromise默认返回undefined,外部调用.then()时自然会报错。
  2. then回调逻辑错误:delayedPromise的resolve没有传入任何值,所以回调里的result是undefined,你写的result === add(number1, number2)会返回一个布尔值,而不是加法运算的结果,完全偏离需求。
  3. 同步异常未处理:validation是同步抛出错误,如果参数不合法,会直接中断代码执行,无法被Promise的错误处理机制捕获。

修正后的代码

const delayedPromise = ms => new Promise(resolve => setTimeout(resolve, ms));

function validation(num1, num2) {
  if (!Number.isFinite(num1) || !Number.isFinite(num2)) {
    throw new Error('Use only numbers');
  }
}

function add(num1, num2) {
  validation(num1, num2);
  return num1 + num2;
}

// 修正后的addPromise
const addPromise = (number1, number2) => {
  // 提前验证参数,捕获同步错误并转为rejected Promise
  try {
    validation(number1, number2);
  } catch (err) {
    return Promise.reject(err);
  }
  // 返回延迟后的Promise,then回调返回加法结果
  return delayedPromise(1000)
    .then(() => add(number1, number2));
};

// 测试代码(注意修正calculator.addPromise为addPromise,或者确保calculator包含该方法)
describe.only('promise calculator', () => {
  it('add works fine', done => {
    addPromise(1, 2).then(result => {
      try {
        assert.equal(3, result);
        done();
      } catch (e) {
        done(e);
      }
    }).catch(done); // 增加catch捕获Promise的rejected状态
  });
});

关键修正点说明

  • 返回Promise实例:addPromise必须返回delayedPromise().then(...)的结果,这样外部才能通过.then()接收异步结果。
  • 修正回调逻辑:delayedPromise延迟结束后,直接调用add并返回其结果,确保下一个.then()能拿到正确的加法值。
  • 处理同步异常:用try/catch捕获validation的同步错误,转为Promise.reject(err),让错误能被Promise的.catch()捕获,避免程序直接崩溃。
  • 测试代码优化:增加.catch(done),确保参数不合法时的错误能被测试框架捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:31:04