Pergunta

O que eu estou tentando fazer envolve passando por uma série de caixas de seleção.

Para cada um deles que é verificado, tenho que realizar alguns cálculos (usando uma chamada ajax). Se houver um erro, eu tenho que quebrar o ciclo e retornar uma mensagem.

Cada chamada ajax leva cerca de 0,4 segundos para executar, mas isso nunca será um problema porque eu só pode ter um máximo de 4 deles verificado a qualquer momento.

Mas o problema que estou enfrentando é que, a final caixa de alerta pops-up antes da uma dentro da função de erro (). A função de erro não funciona, mas ele aparece sempre após o final.

Eu estava sob a impressão de que, ao definir a chamada como assíncrono = false, a execução de código iria esperar até que a chamada retornou uma resposta. Isso é um pressuposto errado?

Existe uma maneira de conseguir isso?

Agradecemos antecipadamente

$("input[id*='chk_aut']").each(function() {
  if(this.value=="on") {
    $.ajax({
      type: "GET",
      url: "testpage.asp",
      cache:"false",
      async:"false",
      data: "which=checkvalues&value="
          + i_value
          + "&ref="+$("#cb_ref").val()
          + "&nif="+$("#txt_nif").val()
          + "&day="+i_day
          + "&month="+i_month
          + "&hours="+i_hours
          + "&year="+i_year + "&ms="
          + new Date().getTime(),
      success: function(msg) {
        //do something but continue the loop
      },
      error: function() {
        i_result =false;
        alert("An error has occurred");
        return false;//break the  loop
      }
    });
  }
});
alert(i_result);
Foi útil?

Solução

Eu acho que você precisa usar

,async: false

Assim que você passar o boolean false , não a cadeia "false" . Isso deve fazer a sua chamada AJAX síncrona.

Consulte esta questão para uma situação semelhante e mais alguns detalhes. Em particular, você pode achar que para chamadas AJAX síncronos você não pode usar o manipulador de sucesso e deve retornar resultados uma vez que sua chamada foi concluída (você está fora do âmbito da própria chamada AJAX).

Se possível, você deve tentar reestruturar seu código para que ele possa trabalhar de forma assíncrona. execução síncrona não traduz bem para o navegador.

Na sua situação, se você estiver usando cada chamada de AJAX para resultados acumular por cada caixa de seleção que está marcada, considere armazenar o valor trabalhando em uma variável de janela e manter o controle de quais os pedidos tenham retornado. Quando você determinar que você recebeu uma resposta bem sucedida de volta para cada uma das chamadas AJAX tiver iniciado, você pode lançar a sua caixa de alerta ou qualquer outra coisa que você quer fazer com os resultados. Isso é apenas um exemplo de como você pode começar a pensar de forma assíncrona.

Outras dicas

Como mencionado na manual, a função error é ...

A função a ser chamada se a solicitação falhar.

Isto é, se há um problema de comunicação entre o cliente eo servidor (por exemplo: tempo limite, sem autorização, etc). Não é chamado quando o script do lado do servidor retorna um valor que em sua aplicação é considerada um erro. Mova esse código em success, e verificar os dados de resposta para ver como seu script tratada cada solicitação.

Além disso, devo mencionar que você precisaria ter realmente boas razões para utilizar chamadas síncronas. Sim, em seu teste leva apenas 1,5 segundos, mas o que acontece quando alguém tem uma conexão lenta, ou o servidor está sob carga pesada ou indisponível? solicitações síncronas congelar navegador do cliente (isto é, não até mesmo coisas como a mudança de abas ou rolagem obras) e para fazer uma muito má experiência do usuário. Se você deseja bloquear a interface do usuário em sua página, há uma abundância de formas mais amigáveis ??para fazê-lo. Por exemplo, veja a BlockUI .

É muito melhor usar retornos de chamada e começar a pensar de forma assíncrona, em vez de processualmente. É um pouco de uma luta quando você começar a primeira (desde que seu código não é necessariamente correr em linha por linha do pedido), mas é muito poderosa e flexível quando você pegar o jeito dele.

Use async:false vez de async:"false" e desfrutar.

Eu não estou familiarizado com a opção async na chamada ajax. Estou usando o jQuery Ajax Manager com sucesso para situações onde eu preciso ajax chamadas síncronas: http: // plugins.jquery.com/project/AjaxManager

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top