为什么setTimeout可以用于无限递归调用?

3
这是我的递归函数:
function importTEI(index,data,header){
    if (index == data.length){return}

    var tei = new dhis2API.trackedEntityInstance();
    tei.excelImportPopulator(header,data[index]);
    tei.POST(requestCallback,requestCallback,index);

    function requestCallback(response){
        notificationCallback(response);
        setTimeout(function(){
            importTEI(response.importStat.index+1,importData,header);
        },0);
    }
}

importTEI函数被调用时使用了setTimeout。如果没有使用setTimeout,那么在进行了几次请求后就会出现以下错误 -

Uncaught RangeError: Maximum call stack size exceeded

但是使用setTimeout,它会永远运行...为什么?setTimeout内部发生了什么特殊的事情?它不再是递归调用了吗?
感激任何提示。谢谢。
2个回答

4

现在这已不是一个递归调用。setTimeout是一个未来的回调函数,而这个调用将位于"堆栈"的顶部。对您函数的现有调用设置了此回调,然后完成其执行,从而导致零递归。


0

setTimeout函数只能执行一次。请检查您的代码。在startTime函数内部,您正在以0毫秒的时间再次调用相同的函数。如果要重复运行一段时间,请改用setInterval。此函数返回一个ID,您可以使用它随时停止它。

参考这个答案: 为什么setTimeout函数会一直执行?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接