如何在setTimeout完成后通过.then返回Promise?代码报错求助
问题排查:基于Promise的延迟加法函数报错处理
错误原因分析
你遇到的TypeError: Cannot read properties of undefined (reading 'then')错误,核心有三个问题:
addPromise未返回Promise实例:函数内部调用了delayedPromise().then(...)但没有return这个链式调用的结果,导致addPromise默认返回undefined,外部调用.then()时自然会报错。then回调逻辑错误:delayedPromise的resolve没有传入任何值,所以回调里的result是undefined,你写的result === add(number1, number2)会返回一个布尔值,而不是加法运算的结果,完全偏离需求。- 同步异常未处理:
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
相关产品推荐
相关产品推荐

