2016-03-02 4 views
0

У нас есть следующий код CoffeeScript. Функция get_job_status получает (через AJAX) статус задачи, выполняемой на бэкэнд Python. Затем он передает статус задачи/результат функции get_job_status. Код должен регулярно проверять статус задачи, пока он не изменится с «running» на «success». Проблема в том, что, когда бэкэнд говорит, что статус задачи является «успехом», приведенный ниже код продолжает проверять его бесконечно (бесконечный цикл).CoffeeScript + JQuery бесконечный цикл обратного вызова

Этот код работал нормально, мы сделали некоторые изменения. Теперь мы застряли в течение нескольких дней, пытаясь решить эту проблему.

window.get_job_status = (id_envio, id_barra_progresso) -> 

    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) -> 
     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] > 5 
      setTimeout (-> 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) -> 
     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) -> 

    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] > 5 
      setTimeout (-> 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 (-> window[funcao_verificacao_resultados]), 1000 

Любая помощь приветствуется.

Спасибо, Bruno

ответ

0

Typoproblem если status_processamento является "успеха и" ->если status_processamento является "су c налог"

+0

Спасибо Sascha. –

0

Если нашли проблему, он был здесь:

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) 

Целью вышеуказанных строк кода было «переключить» между 2 функциями в зависимости от значения tipo_oper acao (я знаю, не очень). Однако синтаксис неверен, и функции get_job_status и verifica_status_job_relatorio ошибочно выполняются. Эти функции вызывали другие функции, и весь ад сломался.

Смежные вопросы