如何在NodeJS的无限循环内运行函数

时间:2019-08-15 11:01:50

标签: node.js loops while-loop setinterval infinite

我有一个函数,其中一个http请求嵌套在另一个请求中,并且两个请求中都有循环。我会演示一下,但是它确实很长而且很凌乱,只会使事情进一步混乱。我一直在尝试使此功能无限期运行,但到目前为止我一直没有成功

这里是我到目前为止所尝试的:

while(true){
 myFunc();
}

在上述情况下,功能根本无法运行

setInterval(myFunc, 1000);

功能每1秒钟启动一次新运行,这绝对是一团糟。该函数本身需要大约30分钟才能停止运行,即1800000 ms。

setInterval(myFunc, 1800000);

该功能从不运行,没有等待30分钟以查看它是否会开始运行

唯一起作用的是在函数的if语句中以递归方式调用它,以检查它是否即将完成,但这会导致内存泄漏。

关于无限期完成该功能后该如何运行的任何提示?

2 个答案:

答案 0 :(得分:1)

不确定我是否明白。 但是您是否尝试等待功能完成?

while(true){
  await myFunc();
}

myFunc是这样的:

// create your function
async function myFunc() {
   // implement your http request that returns a promise
}

答案 1 :(得分:1)

在您的第一个示例中,while循环的阻塞执行阻止了您做出的任何诺言都无法解决。如果myFunc返回Promise或为async,则可以await进行函数调用。

请注意,由于当前节点不支持顶级等待,因此您必须将程序包装在异步函数中,以便能够await myFunc。

function myFunc(){
  return new Promise((res, rej)=>{
    setTimeout(()=>{
      console.log("Resolved")
      res()
    }, 1000)
  })
}

(async () => {
  while(true) await myFunc()
})()

如果您关注while循环内myFunc的返回值,则这种方法可能更可取。

另一种选择是在函数结束时简单地使用process.nextTick(或setImmediatesetTimeout,延迟为0ms)立即重新安排myFunc的另一次执行。 这样可以确保您不会达到最大调用堆栈限制或“泄漏内存”

async function myFunc(){
  // sleep for 1 second
  await new Promise(res=>setTimeout(res,1000))
  console.log("Finished myFunc")
  process.nextTick(myFunc)
  // setImmediate(myFunc)
  // setTimeout(myFunc, 0)
}

myFunc() // initial call to myFunc

如果您仍然遇到问题,建议您查看myFunc本身的代码,并确保您所有的诺言最终得以解决和/或创建一个在取消之前等待最多时间的系统