为什么setTimeout适用于无休止的递归调用?

时间:2016-05-11 11:25:34

标签: javascript recursion settimeout

这是我的递归函数:

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);
    }
}

使用 setTimeout 在函数中调用函数 importTEI 。在没有setTimeout的情况下调用时,在几次请求之后出现此错误 -

Uncaught RangeError: Maximum call stack size exceeded

但是使用setTimeout它会永远运行....为什么会这样?在setTimeout中发生了什么特别的事情?它不再是递归呼叫吗?

任何提示都表示赞赏。日Thnx。

2 个答案:

答案 0 :(得分:4)

它不再是递归通话。 setTimeout是将来的回调,并且该调用将位于堆栈顶部"#34;。对函数的现有调用会设置此回调,然后完成其执行,从而导致零递归。

答案 1 :(得分:0)

setTimeout function works only once. Look into your code. Inside the startTime function , you are calling the same function again in 0 ms. if you want it to repeat for sometime, use setInterval instead. This function returns a id using which you can stop it whenever you want.

refer this answer: Why does the setTimeout function execute forever?