jquery 一个懒惰的函数,只在感觉像- JavaScript时才计算乘法

7uzetpgm  于 2022-11-03  发布在  jQuery
关注(0)|答案(1)|浏览(151)

我最近提出了一个问题,这里有一个函数:

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);
bnlyeluc

bnlyeluc1#

  • 更 * 简单,只需在无限循环的try/catch中调用函数即可:

第一个
return语句在执行时将立即终止函数。如果代码抛出错误,它不会到达return,而是从开始处循环。
使用Function#apply()作为.apply(this, arguments)将确保fn的调用与其他情况下完全相同--使用相同的this值和相同的参数。这样,它也可以用于对象中的方法:
第一个
一个可能的改进是避免无限循环。可以限制函数调用的重试次数,以防万一:

function randExecuter(fn, maxRetries = 100) {
  return function() {
    while(--maxRetries > 0) {
      try {
        return fn.apply(this, arguments);
      } catch(e) { 
        console.error("error, retrying");
      }
    }

    return fn.apply(this, arguments);
  }
}

这将尝试在try/catch中调用函数maxRetries - 1次,然后在块外最后一次调用它。这样,如果它仍然抛出,调用方可以接收到错误。
示例用法:
一个
如果出于某种原因,它确实需要永远重试,则传递Infinity作为第二个参数,这意味着它永远不会停止:randExecuter(someFn, Infinity)

相关问题