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 之前会怎么做?
我认为您对递归函数的最初假设是不正确的。当您调用异步函数时,回调将排队,函数继续并返回。一旦异步函数解析该函数,将再次调用该函数,但这是在它已经返回之后,因此堆栈不会结束。
您可以在此处看到函数的开始和结束位置:
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)
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |