Vou te dar um exemplo para entender o que aconteceu. Um dos casos clássicos para a recursão é o cálculo do fatorial, que também pode ser calculado utilizando laços de repetição, mas eu vou mostrar com recursão porque é mais prático.
Um fatorial de um número, denotado por n!, é o produtório n * (n-1) * (n-2) * ... * (n-m)
, até que (n-m) = 0. Como por exemplo : 3! = 3 * 2 * 1 = 6.
O cálculo do fatorial na programação é muito parecido com o que você quer fazer:
function fatorial(n) {
if (n === 0)
return 1
else
return n * fatorial(n - 1)
}
Veja que temos um caso padrão, que é quando n === 0, assim como você tem dois casos, um onde o status é Ok e outro onde é Not Found. Veja que, caso o else retorne apenas n, o programa irá chamar infinitamente (até o processo usar toda a memória disponível) sem nunca satisfazer a condição, por isso no else é trocado o estado da variável, isto é, o seu valor.
Para que no seu caso o programa não fique sempre parado, você deve alterar alguma coisa dentro do else, de forma que seja possível satisfazer os casos padrões, destravando o programa. No seu caso seria setar um novo proxy para o teste, deste modo, caso não ele também não esteja off o programa seguirá normalmente sem que fique preso dentro do laço.
Uma coisa que você deve ter atenção: é saudável que estipule um número máximo de retrys dentro dos seus testes, porque é possível que todos os proxys estejam off no momento do teste, se isso ocorrer o programa ficará preso no laço de repetição indefinidamente, o que pode causar mais erros.