CoffeeScript + JQuery无限回调循环

时间:2016-03-02 18:32:53

标签: jquery callback coffeescript

我们有以下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

感谢任何帮助。

谢谢你, 布鲁诺

2 个答案:

答案 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。这些功能正在调用其他功能,而且一切都搞得一团糟。