我有一个函数,其中一个http请求嵌套在另一个请求中,并且两个请求中都有循环。我会演示一下,但是它确实很长而且很凌乱,只会使事情进一步混乱。我一直在尝试使此功能无限期运行,但到目前为止我一直没有成功
这里是我到目前为止所尝试的:
while(true){
myFunc();
}
在上述情况下,功能根本无法运行
setInterval(myFunc, 1000);
功能每1秒钟启动一次新运行,这绝对是一团糟。该函数本身需要大约30分钟才能停止运行,即1800000 ms。
setInterval(myFunc, 1800000);
该功能从不运行,没有等待30分钟以查看它是否会开始运行
唯一起作用的是在函数的if语句中以递归方式调用它,以检查它是否即将完成,但这会导致内存泄漏。
关于无限期完成该功能后该如何运行的任何提示?
答案 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(或setImmediate
或setTimeout
,延迟为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
本身的代码,并确保您所有的诺言最终得以解决和/或创建一个在取消之前等待最多时间的系统