Javascript超时重启

时间:2017-03-30 14:06:44

标签: javascript node.js

我的节点应用程序中有一个模块,它有一个setTimeout函数,在每个让我们说60分钟后调用。为简单起见,您可以了解每60分钟后

  • 它连接到某个云
  • 从中查询一些数据
  • 并将其保存在我的Mongo集合中

      setTimeout(() => {
        fetchData();
      }, 3600000); // = 1 hour
    

问题是如果fetchData函数中出现任何错误,那么我会抛出错误,服务器的代码流停止,显然setTimeout永远不会重新启动。

throw new Error(err);

可能的错误方法:

  1. 登录云端
  2. 通过某些查询获取数据
  3. 从云端退出,还有更多
  4. 所以,我需要某种解决方案,在抛出错误后我可以重新启动这个setTimeout函数,这样我的抓取过程就会继续进行。我不确定它是否可能,这就是我在这里发帖的原因。

    请注意,实际上,这个fetchData函数是一个由10个以上的文件和许多JavaScript承诺组成的模块。

    让我知道任何澄清人员的评论。

1 个答案:

答案 0 :(得分:1)

这绝对有可能。您需要正确处理错误。这可以通过一个简单的try catch块来实现:

function simulateError(){
    return (Math.floor(Math.random() * 5) + 1) == 3;
}

function cloudConnect(){
    if (simulateError()){
        throw new Error("Cloud connect error");
    }
    else {
        return "Connection";
    }
}

function cloudQuery(){
    if (simulateError()){
        throw new Error("Query error");
    }
    else {
       return "Query results";
    }
}

function saveCollection(){
    if (simulateError()){
        throw new Error("Save error");
    }
    else {
        return "Save results";
    }
 }

function fetchData(){
      try {
          cloudConnect();
          cloudQuery();
          saveCollection();
      }
      catch(error){
          console.log("Error fetching data: ",error, " will retry in N seconds");
      }
}

//Now that fetchData handles errors with a try/catch block, the interval will continue to run every 60 seconds, 
//regardless of whether or not any errors are thrown
setInterval(function(){
     fetchData();
}, 60000);