【发布时间】:2020-09-11 03:56:23
【问题描述】:
我正在编写一个处理大量数据的测试。令我惊讶的是,如果我在我的函数中添加了一个 setTimeout,它将不再导致堆栈溢出(对于这个站点来说多么合适)。 这怎么可能,代码似乎真的是递归的。 每个 setTimeout 调用都会创建自己的堆栈吗?
有没有办法在不增加所需内存的情况下实现这种行为(异步并按顺序处理巨大的数组/数字)?
function loop(
left: number,
callbackFunction: (callback: () => void) => void,
) {
if (left === 0) {
return
}
console.log(left)
callbackFunction(() => {
loop(left - 1, callbackFunction)
})
}
function setTimeoutCallback(callback: () => void) {
setTimeout(
() => {
callback()
},
Math.random() * 5
)
}
function nonSetTimeoutCallback(callback: () => void) {
callback()
}
loop(100000, setTimeoutCallback) //no stack overflow
loop(100000, nonSetTimeoutCallback) //stack overflow
【问题讨论】:
标签: javascript asynchronous settimeout stack-overflow large-data