Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重复函数本身,不根据其完成情况设置间隔_Javascript_Node.js_Promise_Async Await_Setinterval - Fatal编程技术网

Javascript 重复函数本身,不根据其完成情况设置间隔

Javascript 重复函数本身,不根据其完成情况设置间隔,javascript,node.js,promise,async-await,setinterval,Javascript,Node.js,Promise,Async Await,Setinterval,我需要我的程序不断重复。我的程序开始从服务器获取代理并将其保存到数据库,然后再次将保存的代理发送到另一台服务器。所以我不知道我的程序完成这个任务需要多长时间 我想知道如果发生任何问题,导致startJob()函数花费超过30秒,会发生什么 setInterval是否再次调用它或等待函数完成? 在没有设置间隔的情况下完成后,我的程序重复自己的最佳方法是什么? (用于完成后再次调用exmaple startJob() 我想知道把这个函数放在一个大数字的循环中是否可以,比如: for ( let i

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

我想知道如果发生任何问题,导致startJob()函数花费超过30秒,会发生什么

setInterval是否再次调用它或等待函数完成? 在没有设置间隔的情况下完成后,我的程序重复自己的最佳方法是什么? (用于完成后再次调用exmaple startJob()

我想知道把这个函数放在一个大数字的循环中是否可以,比如:

for ( let i = 0 ; i < 999999999 ; i ++ ) {
    await startJob()
}

grabProxies()在我的服务器上大约需要10秒,PostProxitoChannel()大约需要5秒。

是的,无限循环听起来不错,可以与暂停循环的计时器相比:

   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));

是的,无限循环听起来不错,可以与暂停循环的计时器相比:

   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));

无论在
startJob
中发生什么情况,
setInterval
都会每30秒调用一次。这意味着每隔30秒调用一次
postProxyToChannel
。如果该函数抛出,您将得到未处理的承诺拒绝,但间隔将继续

即使
postProxyToChannel
需要45秒,也不会阻止在上一个
startJob
完成之前再次调用
startJob

如果要确保仅在作业完成30秒后调用
startJob
,可以在
for
循环中
wait
它,然后
wait
每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
中发生什么情况,
setInterval
都会每30秒调用一次。这意味着每隔30秒调用一次
postProxyToChannel
。如果该函数抛出,您将得到未处理的承诺拒绝,但间隔将继续

即使
postProxyToChannel
需要45秒,也不会阻止在上一个
startJob
完成之前再次调用
startJob

如果要确保仅在作业完成30秒后调用
startJob
,可以在
for
循环中
wait
它,然后
wait
每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);
  });

不,包含无限循环或依赖30秒延迟都不是一个好方法。事情可能会出人意料地一团糟,更不用说浪费资源了。您可以使用回调或承诺,在onSuccess中再次调用您的函数,并处理onFailure中的错误。如果将其放入循环中,则不会运行其他JS。除非您有web workers或其他什么,但大多数情况下,您的代码将在单个线程中运行。一个更好的问题是专注于你实际想要实现的目标,因为它目前看起来像。不,这不是一个好的方法,既不包括一个无限循环,也不依赖于30秒的延迟。事情可能会出人意料地一团糟,更不用说浪费资源了。您可以使用回调或承诺,在onSuccess中再次调用您的函数,并处理onFailure中的错误。如果将其放入循环中,则不会运行其他JS。除非您有web workers或其他什么,但大多数情况下,您的代码将在单个线程中运行。一个更好的问题是专注于您实际想要实现的目标,因为它目前看起来像。我喜欢这种方法,但可能“while(true){const waiting=timer(30000);wait postProxyToChannel();wait grabProxies();wait wait waiting;}``所以不计算日期。现在我喜欢这种方法,但是可能是“`while(true){const waiting=timer(30000);wait postProxyToChannel();wait grabProxies();wait waiting;}``所以现在不计算日期