首页 > 解决方案 > 在 JavaScript 的 try catch 块中使用递归

问题描述

我有一个 nodejs 脚本,它为当天记录的温度创建动态表和视图。如果温度不在正常范围内,有时它不会创建表。为此,我决定使用 try catch 并递归调用该函数。我不确定我是否做得正确,或者是否有另一种方法可以调用 con.query 方法,以便创建表。我第一次在nodejs中遇到这个问题。

标签: javascriptmysqlnode.jsrecursiontry-catch

解决方案


首先,您必须检测错误并且仅在存在特定错误条件时才递归。如果您要解决的问题是一个特定错误,那么您可能应该检测到该特定错误,并且仅在遇到该精确错误时才重复该操作。

然后,重试的其他一些建议:

  1. 仅重试固定次数。当一些服务器代码卡在一个循环中,一遍又一遍地敲打某些东西并且每次都得到相同的错误时,这是​​系统操作员的噩梦。

  2. 仅在特定条件下重试。

  3. 记录每个错误,以便您是运行服务器的人,可以在出现问题时解决问题。

  4. 仅在延迟一段时间后重试。

  5. 如果您要重试多次,请实施退避延迟,以便重试之间的时间越来越长。

下面是一些代码实现重试的总体思路:

const maxRetries = 5;
const retryDelay = 500;

function execute_query(query, callback) {
    let retryCntr = 0;
    
    function run() {
        con.query(query, function(err, result, fields) {
             if (err && err is something we should retry for) {
                  ++retryCntr;
                  if (retryCntr <= maxRetries) {
                      console.log('Retrying after error: ', err);
                      setTimeout(run, retryDelay)
                  } else {
                      // too many retries, communicate back error
                      console.log(err);
                      callback(err);
                  }
             } else if (err) {
                  console.log(err);
                   // communicate back error
                   callback(err);
             } else {
                  // communicate back result
                  callback(null, result, fields);
             }
        });
    }

    run();
}

如果要进行大量重试,重试和退避背后的想法是,重试算法可能导致所谓的雪崩失败。系统变得有点慢或有点太忙,它开始产生一些错误。因此,您的代码然后开始一遍又一遍地重试,这会产生更多的负载,从而导致更多的错误,因此更多的代码开始重试,然后整个事情就会失败,大量的代码循环和重试,这就是所谓的雪崩故障。

因此,相反,当出现错误时,您必须确保不会无意中使系统不堪重负,并可能使事情变得更糟。这就是你实现短延迟的原因,这就是你实现最大重试次数的原因,这就是为什么你甚至可以实现一个退避算法来使每次重试之间的延迟更长。所有这些都允许一个有某种错误导致扰动的系统最终自行恢复,而不是让问题变得更糟,以至于一切都失败了。


推荐阅读