NodeJS 如何解决JS中的无限循环?[duplicate]

dffbzjpn  于 2023-03-17  发布在  Node.js
关注(0)|答案(2)|浏览(220)

此问题在此处已有答案

What is "Shadow Identifier Declaration" in JavaScript?(4个答案)
2天前关闭。
我想创建一个函数,当它得到一个错误将去一个函数名为retry,retry将再次尝试该函数,如果它得到错误,它将捕捉错误和重试过程5次,如果它没有通过,它将抛出错误,我得到的是一个无限循环,因为它等待fn和fn有一个错误调用retry,retry将等待de fn再次,所以它永远不会停止,我怎么才能让它进入catch内部重试?

async function retry(fn, retriesLeft = 5, interval = 1500) {
  try {
    return await fn();
  } catch (error) {
    if (retriesLeft) {
      console.log(`Error: ${error.message} | Retrying in ${interval} ms...`);
      await new Promise(resolve => setTimeout(resolve, interval));
      return retry(fn, retriesLeft - 1, interval * 2);
    }
    throw error;
  }
}

function teste(retry) {
  try {
    throw Error
  } catch (error) {
    retry(teste)
  }
}

teste()

我尝试更改代码并在每个步骤中添加console.log,以查看其运行情况,但它总是做同样的事情,它执行函数测试,然后错误使其重试,但它从未在重试中输入catch,我需要它在其中输入ctach,所以进程可以继续。我需要这个进程,因为我试图创建一个泛型函数,当它得到一个错误时重试一个进程。

ccrfmcuu

ccrfmcuu1#

发生这种情况是因为你传递给retry函数的函数也有一个catch块,它会一次又一次地调用retry函数。我认为如果你传递的第一个参数不包含try catch,你的函数会工作得很好。试着像这样调用retry

function teste() {
    throw new Error();
}

retry(teste);
k2arahey

k2arahey2#

请尝试下面的代码:

async function retry(fn, retriesLeft = 5, interval = 1500) {
  try {
    return await fn();
  } catch (error) {
    if (retriesLeft) {
      console.log(`Error: ${error.message} | Retrying in ${interval} ms...`);
      await new Promise(resolve => setTimeout(resolve, interval));
      return retry(fn, retriesLeft - 1, interval * 2);
    }
    throw error;
  }
}

async function teste() {
  try {
    throw new Error('Test Error');
  } catch (error) {
    return Promise.reject(error);
  }
}

retry(teste)
  .then(result => console.log(result))
  .catch(error => console.error(error));

相关问题