javascript - 避免调用函数本身时超出最大调用堆栈大小
问题描述
我有一个检查代理列表的功能,这个列表我会超时更新,所以我需要这个功能来不断检查这里有什么......我使用的是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 是如何工作的,无论如何我可能会收到这个错误......我的意思是我不确定在特定时间段内调用的次数是多少这...或者时间不是一个因素,即使我增加通话之间的时间,我也会以当前的结构得到这个
解决方案
您可以使用无限循环而不是递归调用:
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 秒再次检查。
推荐阅读
- android - 双向数据绑定
- spring - RestTemplate 确实在对象中发送空值
- php - Strava Api 问题
- python - MacOs 上的 PyOpenGL OpenGL 版本
- node.js - 在树莓派上的节点 js 脚本中读取环境变量时出错
- java - 模拟 POST HTTP 请求获取空指针异常
- java - 杰克逊将 GeoJsonPoint 序列化为纬度/经度
- database - 发现之前没有 $ref 的 $id 字段,这是无效的
- java - Mapreduce函数计算入度和出度并使用java显示总和
- javascript - 输入新值时,如何将变量重新设置为从头开始计数?