我们有以下CoffeeScript代码。 get_job_status函数检索(通过AJAX)在Python后端运行的任务的状态。然后它将任务状态/结果传递给get_job_status函数。代码应该定期检查任务状态,直到它从"运行"成功"。问题是,当后端表示任务状态为"成功"时,下面的代码会无限期地检查它(无限循环)。
这段代码工作正常,我们做了一些改动。现在我们被困了几天试图解决这个问题。
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
感谢任何帮助。
谢谢你, 布鲁诺
答案 0 :(得分:0)
Typoproblem 如果status_processamento是"成功" - > 如果status_processamento是" su c
cess"
答案 1 :(得分: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)
上述代码行的目标是"切换"两个函数之间取决于tipo_operacao的值(我知道,不漂亮)。但是语法错误,并且错误地执行了函数get_job_status和verifica_status_job_relatorio。这些功能正在调用其他功能,而且一切都搞得一团糟。