开发者问题收集

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

2016-05-11
377

这是我的递归函数:

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个回答

这不再是递归调用。setTimeout 是将来的回调,并且该调用将位于“堆栈顶部”。对函数的现有调用将设置此回调,然后完成其执行,从而导致零递归。

Jeff Watkins
2016-05-11

setTimeout 函数只能工作一次。查看您的代码。在 startTime 函数中,您将在 0 毫秒内再次调用同一函数。如果您希望它重复一段时间,请改用 setInterval。此函数返回一个 id,您可以使用它随时停止它。

参考此答案: 为什么 setTimeout 函数会永远执行?

Ganesan Srinivasan
2016-05-11