Exit the loop suddenly

2

Let's imagine the following code:

function FazAlgoTrabalhoso(parametro1, parametro2, parametro3){
//Algo trabalhoso aqui
}

var i;
for(i=0;i<=coisas.length;i++){
  //"coisas" é um array já preenchido
  FazAlgoTrabalhoso(coisas[i].algo1, coisas[i].algo2, coisas[i].algo3);
}

$( "#botao_para_cancelar" ).click(function() {
  //Algo para cancelar...
});
  • Let's say that the "things" array has 100 positions, so the for loop run 100 times, that is, it will do "something laborious" 100 times.
  • Let's also consider that "WorkLoad" takes about 5 seconds to run completely.

My question is: How do I manage the cancellation of "WorkOnLine"? For example, if it has already run 50 times, how can I cancel the subsequent executions through a button? I did not succeed in my attempts and it always ends up running the whole loop ....

    
asked by anonymous 02.03.2017 / 14:01

3 answers

2

Your biggest problem is that ...

var i;
for(i=0;i<=coisas.length;i++){
  FazAlgoTrabalhoso(coisas[i].algo1, coisas[i].algo2, coisas[i].algo3);
}

... is a synchronous process, which means that JavaScript will not stop to check if an event has been triggered, such as the click of a button.

You need to convert this function to operate asynchronously:

function FazAlgoTrabalhosoAsync(x) {
  if (!x) x = 0;

  FazAlgoTrabalhoso(coisas[i].algo1, coisas[i].algo2, coisas[i].algo3);

  if (x < coisas.length) 
      setTimeout(function() {FazAlgoTrabalhosoAsync(x + 1);}, 1);
}

FazAlgoTrabalhosoAsync();

setTimeout() causes the function to be called in the future. In the meantime, events can be intercepted, and an interrupt flag marked true :

var tenhoQueParar = false;

$( "#botao_para_cancelar" ).click(function() {
  tenhoQueParar = true;
});

function FazAlgoTrabalhosoAsync(x) {
  if (!x) x = 0;

  FazAlgoTrabalhoso(coisas[i].algo1, coisas[i].algo2, coisas[i].algo3);

  if ((x < coisas.length) && !tenhoQueParar) 
      setTimeout(function() {FazAlgoTrabalhosoAsync(x + 1);}, 1);
}

FazAlgoTrabalhosoAsync();
    
02.03.2017 / 15:00
0

I have decided as follows:

    function FazAlgoTrabalhoso(parametro1, parametro2, parametro3){
    //Algo trabalhoso aqui

    var timer = window.setInterval(function(){
    var pagina = $$('.page').data('page');
    console.log("Estou na página: "+pagina);
    if(pagina != 'preview'){
        //Rotina de cancelamento...

        console.log('Abortado');
        clearInterval(timer);
    }
 },1000);
}

That is, I changed the scope. Instead of canceling at the click of a button, I was able to monitor when the user leaves the page. In this, I cancel the process.

    
03.03.2017 / 23:08
-1

To exit the loop, just add the break

var cancelar = false;
function FazAlgoTrabalhoso(parametro1, parametro2, parametro3){
//Algo trabalhoso aqui
}

var i;
for(i=0;i<=coisas.length;i++){
  //"coisas" é um array já preenchido
  FazAlgoTrabalhoso(coisas[i].algo1, coisas[i].algo2, coisas[i].algo3);
  if (cancelar){
      break;
  }
}

$( "#botao_para_cancelar" ).click(function() {
  cancelar = true;
});
    
02.03.2017 / 14:40