无限期重复异步函数,无需递归/承诺

riw*_*iwu 1 javascript asynchronous callback node.js promise

一旦完成执行,我想重复调用异步函数。
异步函数在完成时调用其回调参数,因此我可以通过使用回调递归调用函数来完成此操作:

const fn = () => asyncFn(fn);
Run Code Online (Sandbox Code Playgroud)

但是,由于 NodeJS 已经停止支持尾调用优化,这种方法最终会导致堆栈溢出。

更好的方法是使用 ES6 Promise:

async function fn() {
  while (true) {
    await new Promise(asyncFn);
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到?在引入 Promise 之前会怎么做?

Mar*_*yer 5

我认为您对递归函数的最初假设是不正确的。当您调用异步函数时,回调将排队,函数继续并返回。一旦异步函数解析该函数​​,将再次调用该函数,但这是在它已经返回之后,因此堆栈不会结束。

您可以在此处看到函数的开始和结束位置:

const runAsync = () => {
    console.log("starting async function")
    setTimeout(() => {
        let v = runAsync()
        console.log("return val", v)
    }, 1000)
    return "async function return"
}
  
console.log("return: ", runAsync())
Run Code Online (Sandbox Code Playgroud)

如果堆栈就此结束,您将永远不会看到返回值。您只会看到starting async function每次通话的日志。这是这里看到的堆栈溢出的行为:

const recursiveFn = () => {
    console.log("starting function")
    let v = recursiveFn()
    console.log("return val", v)
    return "test"  // never gets here
}

console.log("return: ", recursiveFn())
Run Code Online (Sandbox Code Playgroud)