jquery ajax appel synchrone beforeSend
J'ai une fonction appelée:
function callAjax(url, data) {
$.ajax(
{
url: url, //same domain
data: data,
cache: false,
async: false, //use sync results
beforeSend: function() {
//show loading indicator
},
success: function() {
//remove loading indicator
}
}
);
}
Dans le code, je l'appelle "callAjax" X nombre de fois et je veux mettre à jour les données en mode synchrone. Il est fait comme prévu, mais un seul problème: le chargement de l'élément n'est pas afficher dans beforeSend fonction. Si je tourne async true, cela fonctionne, mais les mises à jour ne sont pas fait de façon synchrone.
J'ai essayé plusieurs choses sans succès. J'ai essayé de mettre l'indicateur de chargement avant l'appel ajax comme ceci:
function callAjax(url, data) {
//show loading div
$.ajax(
{
//same as above
}
);
}
Mais pour quelque raison il ne veut pas afficher l'indicateur de chargement. J'ai remarqué un comportement étrange lorsque j'ai mis une "alerte" dans le beforeSend et l'indicateur de chargement s'affiche dans ce cas, mais je préfère ne pas afficher une boîte de message.
Vous avez des idées?
source d'informationauteur Daniel
Vous devez vous connecter pour publier un commentaire.
Effectuer un appel synchrone comme ça, c'est comme mettre en place un "alert ()". Certains navigateurs arrêter ce qu'ils font, complètement, jusqu'à ce que la réponse HTTP est reçu.
Ainsi, dans votre code, après votre appel téléphonique, pour le "$.ajax()" fonction commence, rien produit jusqu'à ce que la réponse est reçue, et la prochaine chose aussi loin que votre code va sera le "succès" de gestionnaire.
Généralement, sauf si vous êtes vraiment confiant dans votre serveur, c'est une bien meilleure idée pour utiliser des appels asynchrones. Lorsque vous le faire de cette façon, le navigateur renvoie immédiatement à son travail et tout simplement à l'écoute en arrière-plan pour la réponse HTTP. Lorsque la réponse arrive, votre succès gestionnaire sera invoqué.
Quand vous ne le blocage I/O le programme est stoppé jusqu'à ce que l'entrée est reçu, en JS mots lorsque vous faites un appel synchrone, le programme s'arrête et la fenêtre du navigateur se bloque (pas de peinture peut être fait) jusqu'à ce que la réponse est reçue. Dans la plupart des cas, faire syncronus appels et de toute sorte de blocage I/O peuvent être évités. Toutefois imaginer votre faire une barre de progression en java ou tout autre langage de programmation, vous devez vous frayer un thread différent pour le contrôle de la barre de progression, je pense.
Une chose à essayer dans votre cas, c'est d'appeler l'appel ajax après un temps de retard
MODIFIER ajaxcall dans setTimeout, Exemple
C'est ce que vous cherchez .ajaxStart()
Il sera déclenchée lorsqu'un ajax événement commence
http://api.jquery.com/ajaxStart/
Ils ont même donner un exemple précis similaire à ce que vous essayez d'accomplir:
Vous pouvez ensuite utiliser .ajaxStop() la fonction