避免在自身调用函数时超出最大调用堆栈大小

时间:2019-07-19 11:44:49

标签: javascript node.js

我具有检查代理列表的功能,该列表会随着时间的推移而更新,因此我需要此功能来不断检查,这里是使用...... im使用nodejs的功能,因此它不在浏览器中

var STACK = [] ;
async function check_proxy(){

    if(STACK.length < 1 )
    {
    setTimeout(()=>check_proxy() , 2000 );
    return ;
    }




    var ipport =  STACK.pop();

    console.log(`------- checking ${ipport}---------`);
    await open_browser(ipport);
    check_proxy();
}

async function open_browser(){
// do proxy checking 
}

check_proxy();

但我不断得到

(node:3052) UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded
    at check_proxy (C:\wamp64\www\robot\proxy-check.js:1:1)
    at check_proxy (C:\wamp64\www\robot\proxy-check.js:42:16)
    at check_proxy (C:\wamp64\www\robot\proxy-check.js:42:16)
    at check_proxy (C:\wamp64\www\robot\proxy-check.js:42:16)
    at check_proxy (C:\wamp64\www\robot\proxy-check.js:42:16)

我了解为什么我会收到此错误,但是如何避免它呢?我不想使用setInterval,因为我希望函数在上一个代理完成后立即检查每个代理,而且我不知道每个代理将花费多长时间

主要是我在这里收到此错误

    if(STACK.length < 1 )
        return setTimeout(()=>check_proxy() , 2000 );

当堆栈为空....有时会发生,并且此数组将随着时间的推移被另一个函数填充

我可以在这里引发setTimeout,所以它不会这么快地调用自身,但是我不确定javascript的工作原理,无论如何我都可能会收到此错误...我的意思是我不确定在特定时间段内的调用次数造成这种情况的时间...或者时间不是一个因素,即使我增加了两次通话之间的时间,我也会以当前的结构来解决这个问题

1 个答案:

答案 0 :(得分:0)

您可以使用无限循环而不是递归调用:

b

这也有助于等待c不再为空的信号,而不是等待固定的2秒钟再次检查。