2010-12-03 28 views
0

J'ai action, qui retourne des données pour les graphiques sur la page. Il prend le paramètre chartType et renvoie les données du graphique. La page utilise jQuery et la fonction $.post pour l'appeler. Voici un exemple:

var fillChart = function (chartData){ /* fill routine here */}; 

$(function() { 
    $.post(
     '/Charts/ChartsJson', 
     'chartType=Type1', 
     fillChart, 
     'json'); 

    $.post(
     '/Charts/ChartsJson', 
     'chartType=Type2', 
     fillChart, 
     'json'); 

    // other calls here [*] 
}); 

J'ai un tableau de types de graphiques, qui devraient être traités. Si j'ajoute tous les appels après la ligne commentée, ils seront tous envoyés en même temps. C'est bon, s'il y a de 1 à 3 articles. Mais s'il y a plus d'objets, alors c'est mauvais pour la performance.
Existe-t-il un moyen de limiter le nombre de demandes de publication exécutées simultanément?
Je sais, que je pourrais utiliser le rappel du premier message, ce qui invoquerait deuxième, et ainsi de suite ... Ma question est: "Y at-il un autre moyen?"

UPD: Chaque appel est déjà partitionné. (Et la quantité d'éléments dans mon tableau n'est pas toujours connue.) Cette action retourne environ 1000 éléments complexes par appel, et chartType indique quelle table utiliser (et quelle logique pour les données d'extraction)
L'extraction totale de toutes les données peut prendre 20 , même 40 secondes. Je veux donc l'afficher en déplacement, car il a été traité.

+0

question similaire: http://stackoverflow.com/questions/4098826/how-can-i-call-ajax-synchronously-without-my-web-page-freezing –

+0

Vous avez raison. Devrais-je supprimer ma question? –

Répondre

4

J'ai réussi à mettre en place une "file d'attente de messages" ad-hoc. Les messages peuvent être des objets json avec les paramètres pour les messages en tant que données. Vous pouvez avoir n'importe quel nombre de travailleurs tirant des objets de la file d'attente.

Par exemple:

var ajax_message_queue = []; 

ajax_message_queue.push({ 
    "ajaxtype" : "post", 
    "action" : '/Charts/ChartsJson', 
    "data"  : handlers.fillChart, 
    "datatype" : "json" 
}); 

Un travailleur serait tout simplement une fonction basée setTimeout qui éjecte du message le plus ancien, et l'exécute. Le travailleur peut alors être empêché de passer le message suivant jusqu'à ce que le premier soit terminé. Si vous voulez que le travailleur peut même faire refaire la demande si elle échoue.

+0

J'aime ça, merci. Où peut voir l'exemple, s'il vous plaît. (Pas besoin de le nettoyer pour moi, il suffit de me donner l'URL, je vais gérer) –

+0

Malheureusement, tous les endroits que j'ai utilisés sont derrière les sections d'administration et nécessitent une connexion ou réseau interne seulement. – chrishomer

1

Ceci est fait automatiquement par le navigateur - un navigateur web n'enverra pas plus d'un certain nombre de requêtes HTTP à un seul serveur à la fois. Ils seront automatiquement mis en file d'attente et exécutés une fois complétés.

Je vous suggérerais de réécrire votre code côté serveur pour permettre la soumission de plusieurs éléments en une seule fois, si vous voulez améliorer les performances.

+0

@The_Smallest Je ne suis pas sûr de ce que vous entendez par "chaque demande de post demande un grand nombre". Ma suggestion est que vous envoyez toutes les données pour l'ensemble du tableau dans une demande POST. – lonesomeday

+0

mais sachez que tous les navigateurs n'ont pas les mêmes paramètres, certains peuvent être plus restrictifs que d'autres. – RobertPitt

+0

Merci, j'ai mis à jour ma question pour expliquer, ce que je veux dire. –

0

Vous devriez probablement envoyer toutes les données à la fois. Re-structurez votre tableau d'entrée pour avoir une clé chartType. De cette façon en backend vous pouvez le traiter en conséquence