Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript超时重启_Javascript_Node.js - Fatal编程技术网

Javascript超时重启

Javascript超时重启,javascript,node.js,Javascript,Node.js,我的node应用程序中有一个模块,它有一个setTimeout函数,每隔60分钟调用一次。为了简单起见,你可以理解每60分钟 它连接到一些云 从中查询一些数据 并保存在我的Mongo收藏中 setTimeout(() => { fetchData(); }, 3600000); // = 1 hour 问题是,若在fetchData函数中出现任何错误,我就会抛出一个错误,服务器的代码流就会停止,显然setTimeout不会再次启动 throw new Error(e

我的node应用程序中有一个模块,它有一个setTimeout函数,每隔60分钟调用一次。为了简单起见,你可以理解每60分钟

  • 它连接到一些云
  • 从中查询一些数据
  • 并保存在我的Mongo收藏中

      setTimeout(() => {
        fetchData();
      }, 3600000); // = 1 hour
    
问题是,若在
fetchData
函数中出现任何错误,我就会抛出一个错误,服务器的代码流就会停止,显然setTimeout不会再次启动

throw new Error(err);
可能的错误方式:

  • 登录到云
  • 通过某种查询获取数据
  • 从云端注销,以及更多
  • 所以,我需要某种解决方案,在抛出一个错误后,我可以重新启动这个setTimeout函数,这样我的抓取过程就会继续进行。我甚至不确定这是否可能,这就是我在这里发帖的原因

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


    请在评论中告诉我任何澄清的人。

    这绝对是可能的。您需要正确处理错误。这可以通过一个简单的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);
    

    为什么不使用
    setInterval
    而不是
    setTimeout
    ?另外,60000表示60秒,而不是60分钟……为什么不使用cron作业而不是
    setInterval
    ;)在DOM准备好并给定时间后,setTimeout被称为single one,如u give 6000,但您需要将setInterval设置为循环中被调用的函数请参考此示例代码您使用的是setInterval还是setTimeout?你们展示了超时代码,但谈到间隔,这是非常重要的confusing@Pete谢谢我已用更正更新了问题,我将尝试此方法。谢谢汉克斯,这有点奏效,但看起来cron对我来说是个更好的解决方案。。。但仍然是+1