2010-11-30 6 views
3

wir wissen, dass nur synchrone Anfragen mit $ .ajax mit einer Option async gemacht werden: false Aber ich habe im Jquery Handbuch gesehen, dass "synchrone Anfragen den Browser vorübergehend blockieren können deaktivieren alle Aktionen, während die Anfrage aktiv ist ". Ich habe einige Fragen wie

Ich habe einige Antworten gesehen sagen, Callback() How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request? zu verwenden. Wie kann ich dies zu meiner Funktion implementieren.

In der folgenden Funktion, wenn die Anfrage fehlschlägt oder wenn die Antwort nicht zurückgibt Wie kann ich damit umgehen. Ich meine Kann ich "error:" oder so etwas verwenden. Wie kann ich diese Funktion verbessern efficently bedeuten mit i Rückruf und Fehlerbehandlung .Es wird gesagt, dass (wir nie Fehler und Erfolg Rückruf mit einer Anfrage haben können)

function empvalidate() { 
      var exists = false;    // default return value is false 
      var empno = $("#empno").val(); 
      if (empno != '') { 
      $.ajax({ 
       url: "emp.php", 
       async: false, 
       dataType: "json", 
       data: {'param1': $("#param1").val(), 'empno': $("#empno").val()}, 
       success: function (data) { 
       exists = data.status;  // set status of existence to outer variable 
       } 
      }); 
      } 
      return exists;     // return actual value 
     } 
+0

Bitte bearbeiten Sie die Frage, um es klarer zu machen, weil dies sicher wie ein Duplikat aussieht. Was müssen Sie wissen, dass die von Ihnen verknüpfte Frage nicht beantwortet wird? –

+0

@Jeff: Wie verbinde ich die Callback-Funktion mit dem obigen Code – Someone

+0

Wenn ich nicht etwas falsch verstehe, ist Ihre 'Erfolg' -Funktion der Rückruf, über den sie sprechen (in den Antworten auf die verknüpfte Frage). –

Antwort

2

Ihre synchronisierten Anfrage wird den UI-Thread verursachen (und daher der Browser) zu warten, bis das XMLHttpRequest Objekt zurückgibt (Art unabhängig davon, ob es fehlgeschlagen oder erfolgreich ist).

jQuery führt Ihren erfolgreichen/vollständigen und Fehlerbehandler genauso aus, wie er ausgeführt würde, wenn Sie eine "normale" asynchrone Anfrage verwenden. Aber es wird warten/blockieren, bevor es dies tut.

Das Worst-Case-Szenario wäre also, dass die eigentliche Anfrage sehr viel Zeit in Anspruch nimmt. Netzwerk-Latenzen sind in diesem Zusammenhang ziemlich schlecht, große Datenmengen .. all diese werden Ihren UI-Thread vollständig blockieren, was offensichtlich eine unangenehme Erfahrung für den Benutzer ist.

Ich weiß wirklich nicht, wo jemand heute eine synchronisierte Ajax-Anfrage verwenden sollte.

+0

Wie kann ich die obige Funktion umschreiben, um die Dinge von dem, was Sie gesagt haben, zu überwinden – Someone

0

Rather async: false als verwenden, würden Sie besser dran, so etwas wie dies zu tun:

function begin_ajax() { 
    // Set your UI states here 
} 

function success_ajax(data) { 
    // Run whatever needs to run if the request is successful. 
} 

function error_ajax(xhr, error_type, msg) { 
    // Display error messages 
} 

function complete_ajax() { 
    // Clean up UI 
} 
$.ajax({ 
    beforeSend: begin_ajax, 
    success: success_ajax, 
    error: error_ajax, 
    complete: complete_ajax 
    // Your parameters here 
}); 
0

Verwenden Sie die komplette Funktion und einen Fall machen für "timeout"

von jQuery Docs

complete(XMLHttpRequest, textStatus) - Function

A function to be called when the request finishes (after success and error callbacks are executed). The function gets passed two arguments: The XMLHttpRequest object and a string categorizing the status of the request ("success", "notmodified", "error", "timeout", or "parsererror"). This is an Ajax Event.

so Code würde so etwas auf Ihrem Ajax aussehen:

function empvalidate() { 
     var exists = false;    // default return value is false 
     var empno = $("#empno").val(); 
     if (empno != '') { 
     $.ajax({ 
      url: "emp.php", 
      async: false, 
      dataType: "json", 
      data: {'param1': $("#param1").val(), 'empno': $("#empno").val()}, 
      success: function (data, ts) { 

       if(ts == "success") 
        exists = data.status; // set status of existence to outer variable 
       else if(ts == "timeout") 
       { 
        $(document).trigger('customTimeoutHandler'); 
       } 
      } 
     }); 
     } 
     return exists;     // return actual value 
    } 

Nicht sicher von der Anwendung hier, aber denken Sie daran, dass Sie auch hier eine benutzerdefinierte Timeout-Variable festlegen können. Nicht sicher, was Sie wollen, es hängt nur von Ihrem Szenario ab.