Question

J'ai une (potentiellement) de longue durée ajax appels que je voudrais abandonner si l'utilisateur accède à une autre page. Les appels de code jQuery suivants avortent sur tous les objets en attente XMLHttpRequest à naviguer loin de la page:

$.ajaxSetup({
    beforeSend: function(xhr) {
        $(window).bind('beforeunload', function() {
            xhr.abort();
        });
    }
});

Dans un cas de test, je force une attente de 10 secondes sur le fonctionnement côté serveur appelé. En utilisant Firebug, je confirme que le code ci-dessus ne provoque en effet tous les ajax attente appelle à mettre fin immédiatement lorsque je clique sur un lien sur la page. Cependant, le navigateur attend toujours les pleins 10 secondes avant de passer à la page suivante. IE semble présenter le même comportement. Est-ce un comportement du navigateur connu? Est-ce que je peux faire permettre à l'utilisateur de naviguer loin de la page immédiatement dans cette situation? Merci à l'avance.

Était-ce utile?

La solution

Merci pour vos réponses! Il se trouve que je me trompais complètement à ce sujet d'être un problème de navigateur - le problème sur le serveur. ASP.NET sérialise demandes de la même session qui nécessitent un état de session, dans ce cas, la page suivante n'a pas commencé le traitement sur le serveur jusqu'à ce que les demandes de paiement ajax-initiés complétées.

Malheureusement, dans ce cas, l'état de session est nécessaire dans le gestionnaire http qui ont répondu aux appels ajax. Mais l'accès en lecture seule est assez bon, donc en marquant le gestionnaire avec IReadOnlySessionState au lieu de IRequiresSessionState, serrures de session ne sont pas tenues et le problème est résolu.

Espérons que cette information se révèle utile aux autres.

Autres conseils

En ce qui concerne propre réponse à cette question de Todd ...

Je viens d'avoir ce problème avec PHP et la même solution aurait travaillé. Cependant, je avais besoin les informations contenues dans la session. Pour les développeurs PHP, vous pouvez appeler session_write_close() pour fermer et écrire votre session au milieu de la demande. Cela permettra de libérer la session pour les autres demandes.

Vous pouvez vérifier un effet secondaire bizarre de abort ()

  

Lorsque la méthode abort () est utilisée, l'événement se déclenche dans readystatechange Explorer et Mozilla. Pire encore, readyState = 4, ce qui signifie que le script xmlhttp moyenne suppose que les données ont été correctement chargé. Cela peut donner des effets très étranges.

documenté ici:

http://www.quirksmode.org/blog/archives /2005/09/xmlhttp_notes_a_1.html

Êtes-vous sûr que vous utilisez une requête asynchrone? Si le navigateur bloque pendant toute la demande, vous utilisez une requête synchrone (async paramètre est false)

Le problème de serveur est également le cas avec le serveur Apache / Php que je travaille avec. Suppression de la session_start sur un script qui n'a pas besoin (AJAX) et tout fonctionne comme prévu. Merci à Todd qui a un problème comme!

Référence à la réponse acceptée:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate /

A propos de IRequiresSessionState

  

Ce que cela signifie est que, pour une session donnée, une seule demande peut exécuter simultanément. Toute autre demande, de cette même session, bloqueront, en attendant que la session soit libéré

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top