我的节点应用程序中有一个模块,它有一个setTimeout函数,在每个让我们说60分钟后调用。为简单起见,您可以了解每60分钟后
并将其保存在我的Mongo集合中
setTimeout(() => {
fetchData();
}, 3600000); // = 1 hour
问题是如果fetchData
函数中出现任何错误,那么我会抛出错误,服务器的代码流停止,显然setTimeout永远不会重新启动。
throw new Error(err);
可能的错误方法:
所以,我需要某种解决方案,在抛出错误后我可以重新启动这个setTimeout函数,这样我的抓取过程就会继续进行。我不确定它是否可能,这就是我在这里发帖的原因。
请注意,实际上,这个fetchData
函数是一个由10个以上的文件和许多JavaScript承诺组成的模块。
让我知道任何澄清人员的评论。
答案 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);