Повторите саму функцию без setInterval в зависимости от ее завершения - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно, чтобы моя программа повторялась постоянно.Моя программа начинает получать прокси с серверов и сохраняет их в базе данных, а затем снова отправляет эти сохраненные прокси на другой сервер.Поэтому я не знаю, сколько времени потребуется моей программе для выполнения этой задачи.

Я хочу знать, что произойдет, если произойдет какая-либо проблема, из-за которой функция 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 секунд на моем сервере.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Независимо от того, что происходит внутри startJob, setInterval будет вызывать его каждые 30 секунд. Это означает, что postProxyToChannel будет вызываться каждые 30 секунд. Если выдает функция , вы получите необработанное отклонение Promise, но интервал продолжится.

Даже если postProxyToChannel потребует, скажем, 45 секунд, это не помешает повторному вызову startJob до завершения предыдущего startJob.

Если вы хотите убедиться, что startJob вызывается только через 30 секунд после его окончания, вы можете await это в цикле for, а затем await Обещание, которое разрешается каждые 30 секунд:

(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();
1 голос
/ 28 мая 2019

Да, бесконечный цикл звучит хорошо, его можно сравнить с таймером, чтобы приостановить цикл:

   const timer = ms => new Promise(resolve => setTimeout(resolve, ms));

  (async function() {
     while(true) {
        await postProxyToChannel();
        await grabProxies();
        await timer(30000);
     }
  })();

Теперь этот цикл запустит задачу, подождите 30 секунд, а затем повторите это. Поэтому цикл не будет запускаться каждые 30 секунд, но обычно занимает больше времени. Чтобы откорректировать это, вы можете измерить время, которое заняло задание, а затем подождать до конца:

  const start = Date.now();

  await postProxyToChannel();
  await grabProxies();

  await timer(30000 - (Date.now() - start));
...