У нас есть следующий код 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
Спасибо Sascha. –