Node.js方法错误自动重试的实现

本文介绍了一种在Node.js中实现自动错误重试的方法,通过包装返回Promise的方法来实现失败重试,避免因网络波动导致的任务失败。文章提供了一个具体的实现示例,并展示了如何使用该方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用Node.js实现爬虫、检测等功能时,经常会遇到大量网络请求的情况,这时很容易因为超时而使得请求失败。为令结果正确,我们一般会设置一定的失败重试次数,以避免因网络波动引起的失败。若多次尝试最终失败,才抛出错误。

下面上一段代码:

/**
 * 包裹方法,使其自动错误重试
 * 只能包裹返回Promise的方法
 * 返回promise,可以获取成功的返回值,或最后失败的err
 * 需要运行环境支持ES6的Promise语法,或者使用Bluebird库
 * @param func
 * @param retryMax
 * @returns {funcR}
 */
function autoRetry(func, retryMax) {
  retryNum = 0;
  let funcName = func.toString().match(/function (\w+)\(/)[1];
  return funcR = function () {
    let params = arguments;
    return new Promise((resolve, reject) => {
      func(...params).then(result => {
        resolve(result);
      }).catch(err => {
        if (retryNum < retryMax) {
          retryNum ++;
          console.warn(`[autoRetry] Catched error when ${funcName}() : ${err.message}. Retry ${retryNum} time...`);
          resolve(funcR(...params));
        } else {
          reject(err);
        }
      });
    });
  };
}

使用起来很简单。下面举一个例子:

// 这是一个标准的Promise化的方法
function foo (param) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try{
        JSON.parse('{{'); // 执行到这里会报错
        return resolve(param);
      } catch (err) {
        return reject(err);
      }
    }, 1000);
  })
}

// 使用autoRetry()包裹方法,并给出最大重试次数(执行数=重试次数+1)
foo = autoRetry(foo, 3);

// 执行并获取结果/捕获错误
foo(123)
  .then(r => {
    console.log('成功返回:');
    console.log(r)
  })
  .catch(e => {
    console.log('最后错误:');
    console.log(e)
  })

// 也可以这样写
(async function (){
    try {
        let result = await foo(123);
    } catch (e) {
        console.log(e);
    }
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值