Javascript超时重启
我有一个模块在我的节点应用程序,它有一个setTimeout函数,每60分钟后调用。 为了简单起见,您可以了解每60分钟后,
- 它连接到一些云
- 从中查询一些数据
-
并保存在我的Mongocollections
setTimeout(() => { fetchData(); }, 3600000); // = 1 hour
问题是,如果在fetchData
函数中出现任何错误,那么我将抛出一个错误,并且服务器的代码stream停止,显然setTimeout永远不会再次启动。
throw new Error(err);
可能的错误方法:
- login到云
- 通过一些查询获取数据
- 从云端登出等等
所以,我需要某种解决scheme,在抛出一个错误后,我可以重新启动这个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);