如何用async/await返回非undefined的Promise及处理错误?
问题分析与解决方案
一、测试失败的原因及修复
你的测试报错3 == undefined,核心问题是**delayedPromise的调用方式错误**:
原delayedPromise仅接受一个参数ms,作用是延迟ms毫秒后调用无参数的resolve(),而你传入了add(num1, num2)和100两个参数,导致:
delayedPromise实际接收的ms是add(1,2)的结果3,延迟3毫秒后执行resolve()- 由于
resolve()未传值,await得到的结果为undefined
修复后的addAwait
正确逻辑是先完成加法计算与验证,再等待100毫秒返回结果;或先等待再执行加法,两种写法均可行:
// 先计算再延迟 const addAwait = async (num1, num2) => { const sum = add(num1, num2); await delayedPromise(100); return sum; }; // 或先延迟再计算(模拟异步计算场景) const addAwait = async (num1, num2) => { await delayedPromise(100); return add(num1, num2); };
二、你的两个疑问解答
1. 为什么delayedPromise没有reject逻辑?
delayedPromise的设计目标是仅提供延迟完成的能力,它依赖的setTimeout在正常使用下不会产生可捕获的异步错误(若ms参数非法,属于同步参数错误,不会进入Promise异步流程)。
如果需要扩展支持主动reject,可以修改函数:
const delayedPromise = (ms, shouldReject = false) => new Promise((resolve, reject) => { setTimeout(() => { shouldReject ? reject(new Error('Delay failed')) : resolve(); }, ms); });
但原函数的定位是单纯的延迟工具,因此不需要reject逻辑。
2. add函数抛出错误时,如何处理reject?
async函数中,同步代码抛出的错误会自动转化为Promise的reject状态,你有两种处理方式:
方式一:在addAwait内部捕获错误
const addAwait = async (num1, num2) => { try { const sum = add(num1, num2); await delayedPromise(100); return sum; } catch (err) { // 可自行处理错误,比如包装后重新抛出 throw new Error(`加法执行失败:${err.message}`); } };
方式二:在调用addAwait时捕获错误
// 测试用例示例 it('handles invalid inputs', async () => { try { await calculator.addAwait('a', 2); assert.fail('预期抛出错误但未触发'); } catch (err) { assert.equal(err.message, 'Only numbers are allowed'); } }); // 或使用.catch()链式调用 calculator.addAwait('a', 2).catch(err => { console.error('输入错误:', err.message); });
由于add是同步执行的,错误会在await语句前触发,async函数会直接返回rejected状态的Promise,无需手动创建reject逻辑。
内容的提问来源于stack exchange,提问作者Fireflies Lftl
相关产品推荐
相关产品推荐

