如何为Promise构建年龄校验的多条件判断链?
实现符合多条件校验的checkAge函数(Promise版本)
原代码存在的问题
- 类型判断错误:
typeof age === undefined写法错误,typeof操作符返回的是字符串类型,判断未传入参数应该用age === undefined。 - 校验逻辑缺失:未实现“非数值”“负数”的校验分支,完全不符合需求。
- Promise用法错误:
- 直接在
resolve/reject中执行console.log,应该传递信息到后续的then/catch处理。 - 最终的验证完成提示放在Promise内部同步执行,无法保证在校验结果输出后执行。
- 直接在
正确实现方案
我们需要按优先级依次完成三个校验条件,利用Promise的reject抛出对应错误,resolve返回成功信息,最后通过finally统一输出验证完成提示(无论成功失败都会执行)。
完整代码实现
function checkAge(age) { return new Promise((resolve, reject) => { // 1. 校验是否未传入age参数 if (age === undefined) { reject("Please, enter your age"); return; } // 2. 校验是否为有效数值(排除非数字类型和NaN) if (typeof age !== 'number' || isNaN(age)) { reject("Please, enter number"); return; } // 3. 校验是否为负数 if (age < 0) { reject("Please, enter positive number"); return; } // 所有校验通过 resolve("Access allowed"); }); }
调用方式(then/catch版)
// 测试未传入参数 checkAge() .then(msg => console.log(msg)) .catch(err => console.log(err)) .finally(() => console.log("Age verification complete")); // 测试传入负数 checkAge(-22) .then(msg => console.log(msg)) .catch(err => console.log(err)) .finally(() => console.log("Age verification complete")); // 测试传入非数值 checkAge("abc") .then(msg => console.log(msg)) .catch(err => console.log(err)) .finally(() => console.log("Age verification complete")); // 测试合法年龄 checkAge(22) .then(msg => console.log(msg)) .catch(err => console.log(err)) .finally(() => console.log("Age verification complete"));
调用方式(async/await版,更易读)
async function verifyAge(age) { try { const result = await checkAge(age); console.log(result); } catch (err) { console.log(err); } finally { console.log("Age verification complete"); } } // 执行测试 verifyAge(); verifyAge(-22); verifyAge("abc"); verifyAge(22);
关键逻辑说明
- 校验顺序:严格按照需求优先级判断,先检查是否未传参,再检查是否为有效数值,最后检查是否为负数,避免逻辑覆盖。
- Promise的reject:每个错误条件触发时,通过
reject抛出对应错误信息,并用return终止后续校验。 - finally方法:Promise的
finally回调无论成功或失败都会执行,完美满足“无论校验结果如何最终输出验证完成”的要求。
内容的提问来源于stack exchange,提问作者intern
相关产品推荐
相关产品推荐

