2010-11-30 9 views
3

nous savons que seules les requêtes synchrones sont faites avec $ .ajax avec une option async: false Mais j'ai vu dans le manuel Jquery disant que "les demandes synchrones peuvent bloquer temporairement le navigateur désactiver toutes les actions pendant que la requête est active ". J'ai quelques questions telles que

J'ai vu quelques réponses en disant d'utiliser callback() How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?. Comment puis-je implémenter ceci à ma fonction.

Dans la fonction ci-dessous Fonction si la demande échoue ou si la réponse ne rentre pas Comment puis-je le gérer. Je veux dire Est-ce que je peux utiliser "error:" ou quelque chose comme ça. Comment puis-je améliorer cette fonction efficently je veux dire à l'aide de rappel et la gestion des erreurs .it est dit que (nous ne pouvons jamais avoir erreur et appel de succès retour avec une demande)

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

S'il vous plaît modifier la question pour le rendre plus clair, car cela ressemble à un doublon. De quoi avez-vous besoin pour savoir que la question que vous avez liée ne répond pas? –

+0

@Jeff: Comment associer la fonction de rappel au code ci-dessus? – Someone

+0

A moins que je ne comprenne quelque chose, votre fonction 'succès 'est le rappel dont ils parlent (dans les réponses à la question liée). –

Répondre

2

Votre demande synchronisée provoquera le thread d'interface utilisateur (et donc le navigateur) pour attendre que l'objet XMLHttpRequest renvoie (le type indépendamment de savoir s'il a échoué ou réussi). JQuery exécutera votre gestionnaire success/complete et error de la même manière qu'il le ferait lorsque vous utilisez une requête asynchrone "normale". Mais il faudra attendre/bloquer avant de le faire.

Ainsi, le pire des cas serait que la requête réelle prenne énormément de temps. Les latences de réseau sont très mauvaises dans ce contexte, les quantités de données importantes ... tout cela verrouillera complètement votre thread d'interface utilisateur, ce qui est évidemment une exprience de l'utilisateur méfiant.

Je ne sais vraiment pas où quelqu'un devrait utiliser une requête ajax synchronisée de nos jours.

+0

Comment puis-je réécrire la fonction ci-dessus pour surmonter les choses de ce que vous avez dit. Toute suggestion s'il vous plaît – Someone

0

Plutôt que d'utiliser async: false, vous feriez mieux de faire quelque chose comme ceci:

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

Utilisez la fonction complète et faire un cas pour "délai d'attente"

de 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.

alors le code ressemblerait à ceci sur votre ajax:

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 
    } 

Pas vraiment sûr de l'application ici, mais n'oubliez pas que vous pouvez également définir une variable de délai d'expiration personnalisé ici aussi. Pas très sûr de ce que vous voudriez qu'il soit, cela dépend de votre scénario.