我需要我的程序不断重复自己。我的程序开始从服务器获取代理并将其保存到数据库,然后将这些保存的代理再次发送到另一台服务器。所以我不知道我的程序需要多长时间来完成此任务。
我想知道如果发生任何问题使该startJob()函数花费30秒钟以上会发生什么情况。
setInterval会再次调用它还是等待函数完成?
在没有setInterval的情况下完成程序重复执行的最佳方法是什么?
(例如,在完成后再次调用exmaple startJob()。)
我想知道是否可以将此函数放入一个循环中,使其具有较大的数字,例如:
for ( let i = 0 ; i < 999999999 ; i ++ ) {
await startJob()
}
这是我的代码:
const startJob = async () => {
await postProxyToChannel()
grabProxies()
}
setInterval(function(){
startJob()
}, (30000))
在我的服务器上,grabProxies()大约需要10秒,而postProxyToChannel()大约需要5秒。
最佳答案
无论startJob
内部发生什么,setInterval
都会每30秒调用一次。这意味着postProxyToChannel
将每30秒调用一次。如果抛出该函数,您将收到未处理的Promise拒绝,但间隔将继续。
即使postProxyToChannel
花了45秒,也不会阻止startJob
在先前的startJob
完成之前再次被调用。
如果要确保在结束后仅在30秒后调用startJob
,可以在await
循环中使用for
,然后await
每30秒解析一次的Promise:
(async () => {
for ( let i = 0 ; i < 999999999 ; i ++ ) {
await startJob();
await new Promise(resolve => setTimeout(resolve, 30000));
}
})()
.catch((err) => {
console.log('There was an error', err);
});
但是仅仅递归调用
startJob
可能更有意义,例如:const startJob = async () => {
try {
await postProxyToChannel();
} catch(e) {
// handle error
}
grabProxies();
setTimeout(startJob, 30000);
};
startJob();