我需要我的程序不断重复。我的程序开始从服务器获取代理并将它们保存到数据库中,然后再次将这些保存的代理发送到另一台服务器。所以我不知道我的程序完成这个任务需要多长时间。
我想知道如果发生任何问题导致 startJob() 函数花费超过 30 秒会发生什么。
setInterval 是否再次调用它或等待函数完成? 我的程序在没有 setInterval 的情况下完成后重复自身的最佳方法是什么? (例如,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
.
如果您想确保 startJob
仅在完成后 30 秒被调用,您可以在 for
循环中 await
它,然后 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();
关于javascript - 重复函数本身,无需根据其完成设置间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56338390/