9
votes

Existe-t-il des événements de mise à jour des progrès dans JQuery Ajax?

J'ai une tâche de course longue qui s'appelle à l'aide de JQuery Ajax. J'utilise le Block UI Plugin pour afficher "Chargement". Y a-t-il de toute façon que je puisse envoyer des messages de progression au client pour montrer les progrès et avoir mis à jour sur le message de plug-in Block UI.

Cela montrera cela (comme le serveur fait son travail). .

"Chargement de la première source..."
"Chargement de la deuxième source..."
"Chargement de la troisième source..."
"Analyse des résultats..."


3 commentaires

mon serveride est C # mais je supposerais que la réponse n'aurait aucune différence compte tenu de la langue d'extrémité différente.


La réponse peut dépendre de -> la "tâche longue" est exécutée côté client ou côté serveur?


La tâche longue en cours est sur le côté serveur


6 Réponses :


11
votes

De ce que j'ai vu pour le cas de la facture de téléchargement - les gens créent une passerelle séparée et interrogez-la pour des informations de progression, car il n'est qu'avissible du côté serveur. Mais je pense que ce n'est pas la meilleure chose dans votre cas.

Si vous souhaitez charger des éléments avec des informations de progression ou permettre au serveur de faire sauter des informations sur la progression tout en générant une sortie, alors streaming http est ce que vous voulez. Il est gentiment couvert ici . Fondamentalement, il s'agit d'une seule demande HTTP, à laquelle le serveur répond dans des morceaux pendant une minute environ (envoyant donc des choses quand il veut), puis une nouvelle connexion est ouverte.

C'était une découverte pour moi;)

[modifier]

Actuellement, il existe de nombreuses techniques de meilleures techniques, et toutes sont enveloppées dans socket.io - Websockets avec Fallbacks à d'autres techniques, y compris streaming http

socket.io est un module pour NDEJS, mais il existe d'autres implémentations similaires et similaires. J'ai déjà échangé des paquets avec java socket.io implémentation de https://github.com/atmosphere/atmosphère - a>


1 commentaires

Merci d'avoir souligné cela. J'ai changé les ressources utilisées dans le poste à d'autres trucs plus récents.



1
votes

Je n'ai récemment pris conscience d'un projet qui fait Ajax "Push". Vous voudrez peut-être vérifier:

http://www.ape-project.org/

Autant que je sache, il y a quelques autres projets qui font des choses similaires, c'est le plus vrai de: "Envoyer des messages de progression à nouveau au client" où l'autre solution nécessite une demande de sondage pour le progrès (toujours un très Solution légitime et bonne).


1 commentaires

Ce projet utilise le streaming HTTP et est lié entre autres dans le deuxième lien que j'ai donné. Néanmoins, APE-Project est un serveur C ++ pour le streaming HTTP et l'utiliser pour effectuer une barre de progression semble être une excès de surende



1
votes

Je voudrais que chaque demande Ajax renvoie une réponse JSON contenant un message, les données et l'URL suivante à demander: {message: "Chargement de la deuxième ressource ...", Données: ..., Next_url: "/ NEXT_PART"}

Avant votre première demande Ajax, définissez le message Blockui sur "Chargement ...". Lorsque vous obtenez la réponse, définissez le message Blockui au message que vous recevez de votre appel AJAX. Ensuite, faites le prochain appel Ajax à la valeur de "Next_url", et ainsi de suite, en boucle jusqu'à ce que vous ayez terminé toutes les tâches.

Si vous chargez un ensemble de données volumineux, mais en morceaux, vous voudrez peut-être faire quelque chose comme un Motif de conception de chargement progressif , mais définissez également un message de progression lorsque vous obtenez chaque réponse.


0 commentaires

4
votes

Un moyen est d'utiliser des gestionnaires http et ajax avec jQuery.

1. Initier la demande côté serveur forte> p> xxx pré>

2. Sondage strong> P>

Qu'est-ce que vous devez faire ensuite, c'est de sonder le serveur à l'intervalle "T" et d'obtenir le statut. Pour cela, nous devons appeler une fonction à l'intervalle «T» qui initierait un appel AJAX à un HTTPHANDLER pour obtenir le statut. P>

$(function() {
  setInterval(updateStatus, 't');
});

function updateStatus() {
  $.ajax({ type: "POST",  url: "GetStatusHandler.ashx",
       contentType: "text/html; charset=utf-8",
       dataType: "html",  
       success: function(data) { process 'data' here and update the block UI message box }
       });
}


0 commentaires

0
votes

Qu'est-ce que vous essayez de faire est quelque chose de similaire à Comet . Les serveurs classiques ("non comet") ne sont pas conçus pour ce type de modèle de transaction et ne sont donc pas une solution souhaitée.

Ma suggestion consiste à rompre le traitement dans une demande client par source de données: < Pré> xxx

Ceci est un exemple de solution asynchrone. Vous pouvez implémenter la manutention de l'état dans rappel () si vous en avez besoin pour être synchrone.


0 commentaires

0
votes

Eh bien, j'ai eu une situation similaire et je le résout avec une autre approche. C'est un travail très moche autour, je sais que, alors s'il vous plaît ne commencez pas à indiquer à quel point c'est mauvais, car je le sais, mais c'était correct pour ce dont j'en ai besoin.

Je mettez les progrès dans un fichier sur le côté serveur. Par exemple, j'ai procédé à process.php qui doit faire beaucoup de travail et il faut un moment jusqu'à ce qu'il soit terminé, de sorte que l'utilisateur devienne nerveux et ferme le navigateur (pas trop bon). Alors processus.php enregistre une certaine sortie dans un fichier sur le serveur. Sur la page qui a appelé le processus.php, j'ai une petite div, une plage ou tout ce que je veux afficher les progrès, mais je suggère de div. Chaque x milliseconde, ou secondes, je charge un autre script du serveur dans la Div, disons display_info.php Maintenant, display_info.php lit le fichier émis par process.php et le contenu est diplayé dans la Div.

Vous devez faire attention à ce que la sortie de process.php doit être unique pour chaque occasion, sinon vous gâcherez la sortie INFO sur les navigateurs.

emil


0 commentaires