javascript - 重复函数本身,无需根据其完成设置间隔

标签 javascript node.js promise async-await setinterval

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

我想知道如果发生任何问题导致 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/

相关文章:

javascript - JavaScript Promise 到底是什么时候创建的?

exception - Dojo - 吞下 Promise 中的 ReferenceError 异常

jquery - 在 jQuery 中获得已解决的 promise 的更好方法?

javascript - 如何执行 JavaScript 代码

node.js - 上传带有标题的图片

node.js - 带参数的路由被调用两次?

javascript - 没有 babel 或 webpack 的 ReactJS Hello World

javascript - Jest 捕获输入更改事件并验证在受控 react 组件上使用正确的值调用它

javascript - 在我的情况下如何设置间隔时间

javascript - 为什么 IntelliJ 不断从这个 JavaScript 模板字符串中删除反引号?