JavaScript:循环调用随机乘法函数直至成功的方案是否可行?
方案可行性与优化建议
现有方案是否可接受?
你的方案完全可以接受,它正确实现了「持续调用randMulti直到获取有效乘法结果」的核心需求,严格遵守了不可修改原函数的限制,逻辑清晰易懂,能够稳定完成任务。
更优的实现方式
原始方案可以从代码精简、控制台整洁度两方面优化:
- 移除冗余的
allOK标志位与res变量,成功时直接返回结果,无需额外状态标记 - 去掉
catch块中的console.error:因为失败是预期内的高频情况,打印大量错误会污染控制台日志,完全不需要处理
优化后的循环实现(推荐)
class MultiError extends Error{} function randMulti(a,b) { if(Math.random() < 0.1) { return a*b; } else { throw new MultiError("Error Occurred"); } } function randExecuter(fn) { return function(a,b) { while(true) { try { // 成功直接返回,终止循环 return fn(a,b); } catch(e) { // 预期内的失败,无需额外处理 } } } } let multiply = randExecuter(randMulti); const result = multiply(7,5); console.log(result);
递归实现(仅作参考)
也可以用递归方式实现,但要注意:极端情况下(连续无数次失败)可能触发栈溢出,因此循环方式更稳妥:
function randExecuter(fn) { return function(a,b) { try { return fn(a,b); } catch(e) { // 递归调用当前函数重试 return arguments.callee(a,b); } } }
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

