首页 > 解决方案 > 避免调用函数本身时超出最大调用堆栈大小

问题描述

我有一个检查代理列表的功能,这个列表我会超时更新,所以我需要这个功能来不断检查这里有什么......我使用的是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 是如何工作的,无论如何我可能会收到这个错误......我的意思是我不确定在特定时间段内调用的次数是多少这...或者时间不是一个因素,即使我增加通话之间的时间,我也会以当前的结构得到这个

标签: javascriptnode.js

解决方案


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

const STACK = [];

function sleep(ms) {
    return new Promise(resolve => {
        setTimeout(resolve, ms);
    });
}

async function check_proxy() {
    while (true) {
        if (STACK.length === 0) {
            await sleep(2000);
            continue;
        }

        const ipport = STACK.pop();

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

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


推荐阅读