web-dev-qa-db-fra.com

Combien de temps le navigateur attendra-t-il après une requête ajax?

Combien de temps le navigateur peut-il attendre avant qu'une erreur ne soit affichée avant que le serveur réponde à la demande? Ce temps peut-il être illimité?

62
Taras Lukavyi

Si vous utilisez un appel jQuery $ .ajax, vous pouvez définir la propriété timeout pour contrôler le délai de traitement d'une demande avec le statut d'expiration. Le délai d'attente est défini en millisecondes, il suffit donc de le définir sur une valeur très élevée. Vous pouvez également le définir sur 0 pour "illimité", mais à mon avis, vous devriez simplement définir une valeur élevée à la place.

Remarque: unlimited est en fait, la valeur par défaut mais la plupart des navigateurs ont des délais d'attente par défaut qui seront touchés.

Lorsqu'un appel ajax est renvoyé en raison de l'expiration du délai, il est renvoyé avec un statut d'erreur "expiration" que vous pouvez gérer avec une casse distincte si nécessaire.

Donc, si vous voulez définir un délai d'attente de 3 secondes et gérer le délai d'attente, voici un exemple:

$.ajax({
    url: "/your_ajax_method/",
    type: "GET",
    dataType: "json",
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited
    success: function(response) { alert(response); },
    error: function(jqXHR, textStatus, errorThrown) {
        if(textStatus==="timeout") {  
            alert("Call has timed out"); //Handle the timeout
        } else {
            alert("Another error was returned"); //Handle other error type
        }
    }
});​
73
Tj Kellie

Oui et non. Oui, le serveur peut le faire ou être configuré pour le faire. Non, les navigateurs (je ne connais pas les spécificités de la version/du distributeur) peuvent activer les dépassements de délai.

Il existe 2 solutions pour atteindre/émuler ceci via HTTP:

  • Si cela est simple, un long script courant et que vous attendez des résultats, ce n'est pas la solution, vous devriez plutôt faire comme l'affiche précédente et utiliser un traitement asynchrone avec interrogation du serveur pour les résultats, ce serait une solution beaucoup plus sûre. . Par exemple: un script de vignette du côté serveur de processeur d’image: l’utilisateur télécharge une image, le serveur renvoie immédiatement un 200 et un "Job ID". Le client (javascript ^^) peut ensuite utiliser le JobID pour demander le statut/le résultat du travail.
  • Si votre objectif est d’avoir une connexion en temps réel entre le navigateur et le serveur (connexion à sens unique, une fois la requête effectuée par le navigateur, aucune information supplémentaire ne peut être envoyée sans utiliser de nouvelles requêtes (ajax ^^)), on parle de longue interrogation./reverse ajax et peut être utilisé pour la communication en temps réel via http. Il existe plusieurs techniques utilisant 2 longues requêtes interrogées en parallèle, de sorte qu'une fois l'une d'elles expirée, la seconde devient active et la première tente de se reconnecter.
14
smassey

Pouvez-vous expliquer un peu plus ce que vous essayez d'atteindre - avez-vous un processus long sur un serveur, souhaitez-vous modifier les paramètres sur une machine locale ou recherchez-vous un moyen de le gérer pour les grands nombres? des utilisateurs?

La durée d'attente du navigateur dépend d'un certain nombre de facteurs, par exemple: où le délai d'attente survient - est-ce au niveau TCP, le serveur ou le navigateur local?

Si vous avez un processus long sur un serveur et que vous souhaitez mettre à jour une page Web par la suite, le moyen habituel de le gérer est d'exécuter le processus long de manière asynchrone et d'avertir le client lorsqu'il est terminé, par exemple. avoir un appel ajax qui interroge le serveur, ou utiliser HTTP 1.1 et fournir un flux de notification au client.

Dans les deux cas, il est toujours possible de fermer la connexion et le client aura toujours besoin de la possibilité de la rouvrir.

3
Andy Davies

J'ai constaté qu'en cas de demande normale (page HTML), les navigateurs fonctionnaient avec un délai d'expiration après cca. 30 secondes C'est important, car d'autres participants le suivent probablement: les mandataires, les routeurs (les routeurs jouent-ils dans ce jeu? Je ne suis pas sûr). J'utilise 4 sec long délai côté serveur (s'il n'y a rien à envoyer au client), et mon AJAX client effectue une autre requête HTTP immédiatement (je suis sur réseau local, il n’ya pas de décalage Internet. 4 secondes sont suffisamment longues pour ne pas surcharger le serveur et le réseau avec des sondages fréquentés et sont assez courtes pour le cas où, en quelque sorte, un sondage sort de la ligne que le client ne peut pas détecter. et gérer.

En outre, il existe d'autres problèmes avec comet (requête HTTP longue): limitation du nombre de requêtes HTTP simultanées par le navigateur, gestion des événements côté client (à envoyer immédiatement au serveur), détection et récupération de panne de serveur/réseau, gestion multi-utilisateurs etc.

2
ern0