我需要我的程序不断重复自己。我的程序开始从服务器获取代理并将其保存到数据库,然后将这些保存的代理再次发送到另一台服务器。所以我不知道我的程序需要多长时间来完成此任务。

我想知道如果发生任何问题使该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();

08-19 16:18