title: CoffeeScript + JQuery infinite callback loop
body: <p>We have the following CoffeeScript code. The get_job_status function retrieves (via AJAX) the status of a task running at the Python backend. Then it passes the task status/result to the get_job_status function. The code should keep checking the task status on a regular basis until it changes from  "running" to "success". The problem is, when the backend says the task status is "success", the code below keeps checking it indefinitely (endless loop).</p>
  
  <p>This code was working normally untile we made some changes. Now we are stuck for days trying to fix this issue. </p>
  
  <pre><code>window.get_job_status = (id_envio, id_barra_progresso) -&gt;
  
      console.log "ID envio em get_job_status: " + id_envio
  
      unless id_envio of window.contadorErros
          window.contadorErros[id_envio] = Number(0)
  
      informacoes_adicionais =
          id_barra_progresso: id_barra_progresso
          id_envio: id_envio
  
      dados_enviar = JSON.stringify(
          id_envio: id_envio
      )
  
  
      ajax_verifica_status = $.ajax(
          type: "POST"
          url: "/resultadojobrqenvio"
          data: dados_enviar
          cache: false
          timeout: 3000
          context: informacoes_adicionais
      )
  
  
      ajax_verifica_status.fail (jqXHR, textStatus, errorThrown) -&gt;
          id_envio = String(this.id_envio)
          id_barra_progresso = String(this.id_barra_progresso)
  
          console.log 'O GET request enviado via JQuery.ajax solicitando ao backend o status do job de envio de e-mails
                  agrupados  com ID: "' + id_envio + '") FALHOU. Detalhes:\nHTTP Status: ' + textStatus +
                  '\nTexto resposta HTTP: '+ jqXHR.responseText + '\nErro do JQuert.ajax:  ' + errorThrown
  
  
          console.log 'IdBarraProcStr: "' +id_barra_progresso + '"'
  
          $selector_barra_progresso = $('#' +id_barra_progresso)
  
          $selector_barra_progresso.width '100%'
          $selector_barra_progresso.text "ERRO!"
          $selector_barra_progresso.removeClass()
          $selector_barra_progresso.addClass "progress-bar progress-bar-custom-vermelho"
  
          window.contadorErros[id_envio] += 1
  
          unless window.contadorErros[id_envio] &gt; 5
              setTimeout (-&gt; get_job_status id_envio, id_barra_progresso), 2000
          else
              console.log 'Ocorreram 5 erros consecutivos no GET request enviado via JQuery.ajax solicitando ao backend o
                  status do job do RQ "' + tipo_operacao + '" referente ao arquivo arquivo "' + nome_arquivo_pai +
                  '" (ID: "' + id_relatorio + '") FALHOU. Detalhes:
                  \nHTTP Status: ' + textStatus + '\nTexto resposta HTTP: '+ jqXHR.responseText + '\nErro do JQuert.ajax:  ' + errorThrown
  
  
      ajax_verifica_status.done (json_serializado, textStatus, xhr) -&gt;
          id_envio = String(this.id_envio)
          id_barra_progresso = String(this.id_barra_progresso)
  
          console.log "Rodou .done em get_job_status()"
  
          interpret_job_result id_envio, id_barra_progresso, '', 'envio_emails_agrupado', json_serializado
  
  
  
  window.interpret_job_result = (id_operacao, id_barra_progresso, nome_arquivo_pai, tipo_operacao, json_serializado) -&gt;
  
      console.log 'tipo_operacao in interpret_job_result(): "' + tipo_operacao + '", ID da operacao "' + id_operacao + '".'
  
      $selector_barra_progresso = $('#' + id_barra_progresso)
  
      if tipo_operacao == 'envio_emails_agrupado'
          funcao_verificacao_resultados = get_job_status(id_operacao, id_barra_progresso, nome_arquivo_pai, tipo_operacao)
      else
          funcao_verificacao_resultados = verifica_status_job_relatorio(id_operacao, id_barra_progresso, nome_arquivo_pai, tipo_operacao)
  
  
      try
          json_object = JSON.parse(json_serializado)
      catch erro
          json_object = {}
  
          console.log 'ERRO ao tentar realizar parse do JSON recebido do servidor Pyhon. Referente a operacao "' + tipo_operacao + '",
                  com ID "' + id_operacao + '", arquivo "' + nome_arquivo_pai + '"\nConteudo JSON: ' + JSON.stringify(json_serializado)
  
          $selector_barra_progresso.width '100%'
          $selector_barra_progresso.text "ERRO!"
          $selector_barra_progresso.removeClass()
          $selector_barra_progresso.addClass "progress-bar progress-bar-custom-vermelho"
  
          window.contadorErros[id_operacao] += 1
  
          unless window.contadorErros[id_operacao] &gt; 5
              setTimeout (-&gt; window[funcao_verificacao_resultados]), 2000
          else
              erro = 'Ocorreram 5 erros consecutivos no parse do JSON recebido do backend Python, referente a verificacao' +
                  'do status da operacao "' + tipo_operacao + '" com ID: "' + id_operacao + '".'
  
              console.log(erro)
  
              exibe_erros(id_operacao, '', id_barra_progresso, tipo_operacao, erro)
  
  
      status_processamento = json_object.status
      erros_processamento = json_object.erros_e_warnings
      nome_arquivo_gerado = json_object.nome_arquivo_gerado
      progresso_percent = json_object.progresso_percent
  
  
      if status_processamento is "sucess"
          console.log 'Operacao "' + tipo_operacao + '" com ID "' + id_operacao + '" (arquivo pai: ' + nome_arquivo_pai + ') concluido com SUCESSO.'
  
          $selector_barra_progresso.width '100%'
          $selector_barra_progresso.text "Concluído"
          $selector_barra_progresso.removeClass()
          $selector_barra_progresso.addClass "progress-bar progress-bar-custom-verde"
  
      else if status_processamento is "fail"
          console.log 'Operacao "' + tipo_operacao + '" com ID "' + id_operacao + '" (arquivo pai: ' + nome_arquivo_pai + ') FALHOU.'
  
          exibe_erros(id_operacao, nome_arquivo_pai, id_barra_progresso, tipo_operacao, erros_processamento)
  
  
      else if status_processamento is "running"
          console.log 'Job "' + tipo_operacao + '" com ID "' + id_operacao + '" (arquivo pai: ' + nome_arquivo_pai + ') RODANDO. '
  
          $selector_barra_progresso.width progresso_percent + '%'
          $selector_barra_progresso.text progresso_percent.toString() + '%'
  
          $selector_barra_progresso.removeClass()
          $selector_barra_progresso.addClass "progress-bar progress-bar-custom-verde active"
  
          setTimeout (-&gt; window[funcao_verificacao_resultados]), 1000
  </code></pre>
  
  <p>Any help is appreciated. </p>
  
  <p>Thank you,
  Bruno</p>