2009-04-28 11 views

Répondre

7

Non. Il n'y a certainement aucun moyen simple.

Je peux penser à certaines façons complexes, mais elles ne seraient pas fiables.

Vous aurez probablement plus de chance d'élaborer un processus pour inverser les changements d'une demande que vous avez été parcourus (je suppose que c'est la raison pour laquelle vous voulez arrêter.)

+0

la raison serait d'arrêter un processus long de prendre des ressources afin de ne pas vraiment faire avec des modifications à un DB . merci pour la réponse – AndreLiem

+1

Comme le mentionne zombat ci-dessous, si c'est un long processus, vous pourriez avoir le temps de faire quelque chose, mais identifier le thread Apache serait très difficile. Vous devez configurer un mécanisme de stockage pour lier les scripts en cours d'exécution aux requêtes (ce qui signifie que les requêtes doivent inclure un identifiant unique). Si vous avez stocké ce lien dans une base de données, vous pouvez envoyer une deuxième requête pour marquer l'annulation de la demande, puis interroger périodiquement cet enregistrement de base de données à partir de votre script en cours d'exécution pour voir si vous pouvez arrêter de travailler. Ce serait très compliqué et il y a beaucoup de potentiel d'erreur/activité malveillante. –

0

Le moyen le plus Ce serait juste pour envoyer un en-tête de réponse HTTP 503 (ou similaire) et abandonner l'application côté serveur (ou simplement abandonner l'application). En supposant qu'aucune donnée n'a été envoyée et/ou que vous avez coché le côté client de l'en-tête de réponse HTTP, vous pouvez le traiter comme une demande ayant échoué.

0

La réponse courte est "non". À moins que vous ne parliez d'un processus d'arrière-plan très long sur le serveur, auquel cas vous pourriez avoir une seconde requête Ajax pour lancer un arrêt. Mais si vous parlez d'une requête régulière à un serveur Apache/PHP, alors ... identifier le thread Apache dans lequel votre requête s'exécute serait assez compliqué.

Il serait beaucoup plus facile de vérifier votre demande Ajax en quelque sorte avant même de commencer le processus; Assurez-vous que c'est ce que vous voulez faire fonctionner. Vous pouvez également avoir un processus de confirmation Javascript si vous avez besoin que l'utilisateur sache que ce qu'il fait ne peut pas être interrompu. Comme Steven posté, avoir un processus d'inversion semble être aussi dans votre meilleur intérêt.

4

Initier une autre requête Ajax. J'ai trouvé ce fil en essayant de comprendre comment empêcher qu'une requête précédente soit interrompue quand une autre est appelée.

1

Il n'y a pas de bons moyens pour arrêter la demande elle-même sur le réseau (comme beaucoup l'ont dit), mais il est relativement facile d'arrêter les effets de la demande. sur le côté serveur: vous pouvez exit (ou quel que soit le terme dont vous auriez besoin pour tuer le script) en vérifiant constamment les variables globales (agissant comme des drapeaux) comme les cookies ou les sessions (encore une fois, en supposant qu'elles changeraient pendant le exécution du script). En outre, vous pouvez conserver les fichiers ou les entrées de base de données en tant que drapeaux (que vous pouvez interroger pour l'existence). Côté client: vous pouvez appeler abort (ce qui ne fonctionne pas dans tous les navigateurs, comme d'autres l'ont dit), ou vous pouvez garder un sémaphore global/drapeau en haut de votre rappel (qui vérifie le global valeur pour voir si elle devrait encore être exécutée ou non). exemple:

window.ajaxIsStillGood = true; 

xhr.onreadystatechange = function() 
{ 
    if(4 === xhr.readyState && 200 === xhr.status) 
    { 
     if(true === window.ajaxIsStillGood){ /* still good */ } 
    } 
} 

/* bad stuff happens */ 

window.ajaxIsStillGood = false; // now the code won't execute 
-1

Que diriez-vous d'envoyer une autre requête Ajax qui changerait en particulier $_SESSION var qui est contrôlée par ce long processus?

0

Pour PHP, j'ai trouvé un moyen d'arrêter ou d'abandonner en utilisant session_write_close();. Il suffit de mettre cela après session_start() sur votre script. Si vous utilisez framwework ou OOP, conservez-le en première ligne de votre méthode. Cela se produit car les données de session sont verrouillées jusqu'à ce que l'ajax soit terminé.

Testé & a vu une autre page chargement maintenant après xhr.abort()

conseils de solution trouvée ici Abort Ajax requests using jQuery

Questions connexes