Domanda

Quello che sto cercando di fare coinvolge passare attraverso una serie di caselle di controllo.

Per ciascuno di essi che è bloccato, devo eseguire alcuni calcoli (utilizzando una chiamata ajax). Se c'è un errore, devo rompere il ciclo e restituire un messaggio.

Ogni chiamata AJAX impiega circa 0,4 secondi per eseguire, ma che non deve mai essere un problema perché posso avere solo un massimo di 4 di loro controllati in qualsiasi momento.

Ma il problema che sto affrontando è che, la finestra di avviso pop-up finale prima di quello all'interno della funzione di errore (). La funzione di errore funziona ma sembra sempre dopo quella finale.

Ho avuto l'impressione che, definendo la chiamata come asincrona = false, l'esecuzione di codice avrebbe aspettato fino a quando la chiamata ha restituito una risposta. che è un presupposto sbagliato?

C'è un modo per ottenere questo risultato?

Grazie in anticipo

$("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);
È stato utile?

Soluzione

Credo che è necessario utilizzare

,async: false

In modo che si passa il booleano false , non la stringa "false" . Questo dovrebbe rendere la vostra chiamata sincrona AJAX.

questa domanda per una situazione simile e qualche dettaglio in più. In particolare, è possibile che per sincrona chiamate AJAX non è possibile utilizzare il gestore di successo e deve restituire i risultati una volta che la chiamata è stata completata (sei fuori del campo di applicazione del AJAX dirsi).

Se possibile si dovrebbe cercare di ristrutturare il codice in modo che possa funzionare in modo asincrono. esecuzione sincrona non si traduce bene al browser.

Nella tua situazione, se si utilizza ogni chiamata AJAX per accumulare risultati per ogni casella di controllo è selezionata, prendere in considerazione la memorizzazione del valore di lavoro in una variabile finestra e tenere traccia di quali richieste sono tornati. Quando si determina che avete ricevuto una risposta positiva posteriore per ciascuna delle chiamate AJAX che ha avviato, è possibile dare il via la tua casella di avviso o qualsiasi altra cosa si vuole fare con i risultati. Questo è solo un esempio di come si può iniziare a pensare in modo asincrono.

Altri suggerimenti

Come indicato nella href="http://docs.jquery.com/Ajax/jQuery.ajax#options" manuale , la funzione error è ...

  

Una funzione da chiamare se la richiesta non riesce.

Cioè, se c'è un problema di comunicazione tra il client e il server (ad esempio: timeout, nessuna autorizzazione, ecc). Non è chiamato quando lo script lato server restituisce un valore, che nella vostra applicazione è considerato un errore. Spostare il codice in success, e controllare i dati di risposta per vedere come lo script trattata ogni richiesta.

Inoltre, vorrei ricordare che si avrebbe bisogno di avere davvero buone ragioni per utilizzare le chiamate sincrone. Sì, nel test richiede solo 1,5 secondi, ma cosa succede quando qualcuno ha una connessione lenta, o il vostro server è sotto carico pesante o non disponibile? richieste sincrone congelare il browser del client (cioè, nemmeno le cose come cambiare le schede o lo scorrimento opere) e fare per un molto brutta esperienza utente. Se si vuole bloccare l'interfaccia utente sulla pagina, c'è un sacco di modi più amichevole per farlo. Ad esempio, controllare BlockUI .

E 'molto meglio utilizzare le richiamate e cominciare a pensare in modo asincrono, piuttosto che procedurale. E 'un po' di fatica quando si inizia (dal momento che il codice non è necessariamente correre in prima linea per linea ordine), ma è molto potente e flessibile volta a ottenere il blocco di esso.

Usa async:false invece di async:"false" e godere.

Non ho dimestichezza con l'opzione async nella chiamata ajax. Sto usando il Gestore jQuery Ajax con successo per le situazioni in cui ho bisogno chiamate ajax sincrone: http: // plugins.jquery.com/project/AjaxManager

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top