我最近提出了一个问题,这里有一个函数:
function randMulti(a,b) {
if(Math.random() < 0.1) {
return a*b;
} else {
throw new MultiError("Error Occurred");
}
}
任务是调用此函数,直到我们得到结果。我所说的结果是指乘法的结果,因为randMulti
有一个抛出错误的条件,这是基于Math.Random的,所以它可能会失败一定的次数,任务是调用它,直到我们得到乘法结果。
为了达到这个目的,我使用了一个标志并运行了一个while循环直到我得到了结果。
限制条件:我们可以更改randMulti
函数。必须抛出错误。
问题:下面的解决方案是这种情况下可以接受的解决方案吗?或者有没有什么好的方法可以达到同样的结果?
下面是JSFiddle链接的完整代码:FIDDLE
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) {
let allOK = false;
let res = '';
while(!allOK) {
try {
res = fn(a,b);
allOK = true;
} catch(e) {
console.error(e);
}
}
return res;
}
}
let multiply = randExecuter(randMulti);
const result = multiply(7,5);
console.log(result);
1条答案
按热度按时间bnlyeluc1#
第一个
return
语句在执行时将立即终止函数。如果代码抛出错误,它不会到达return
,而是从开始处循环。使用
Function#apply()
作为.apply(this, arguments)
将确保fn
的调用与其他情况下完全相同--使用相同的this
值和相同的参数。这样,它也可以用于对象中的方法:第一个
一个可能的改进是避免无限循环。可以限制函数调用的重试次数,以防万一:
这将尝试在
try
/catch
中调用函数maxRetries - 1
次,然后在块外最后一次调用它。这样,如果它仍然抛出,调用方可以接收到错误。示例用法:
一个
如果出于某种原因,它确实需要永远重试,则传递
Infinity
作为第二个参数,这意味着它永远不会停止:randExecuter(someFn, Infinity)
个