Précédent   Forum du club des développeurs et IT Pro > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/12/2012, 19h00   #1
sidacoq
Invité de passage
 
Inscription : février 2008
Messages : 47
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 47
Points : 4
Points : 4
Par défaut XMLHTTPRequest Requête simultanée

Bonjour,

J'aimerais savoir s'il est possible de limiter les requêtes simultannées XHR ?
J'ai une boucle qui lit un fichier JSON et qui envoie une requête XHR a chaque ligne (100 lignes).

Le problème est qu'il envoi 100 requêtes en même temps et que le serveur de l'autre côté ne gére pas çà (Google)

Le but est d'injecter 100 nouvelles entrées dans un calendrier Google via Google Calendar API.
Dans ce cas, XHR et le fichier JSON ne concerne pas l'API de Google.

En comparaison, Mootools gére très bien çà dans le REQUEST avec l'option LINK: CHAIN. Mais je ne peux pas l'utiliser car CORS ne gére pas les entête X-Requested-With et Mootools ne permet pas de supprimer cette entête.

Voila merci en espérant que vous pouvez m'aider.
sidacoq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 08h53   #2
NoSmoking
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 5 107
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 5 107
Points : 8 820
Points : 8 820
Bonjour,
as tu essayé d'envoyer la requête suivante quand la précédente à aboutie?
NoSmoking est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 11h28   #3
Bovino
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 18 157
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 42
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 18 157
Points : 65 033
Points : 65 033
Je pense surtout que tu as essentiellement un problème de conception...
Prévoir d'envoyer une centaine de requêtes simultanées n'est pas viable, tu devrais penser à rapatrier toutes les données en une seule fois puis faire les traitements adaptés.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 00h32   #4
sidacoq
Invité de passage
 
Inscription : février 2008
Messages : 47
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 47
Points : 4
Points : 4
Citation:
Envoyé par Bovino Voir le message
Je pense surtout que tu as essentiellement un problème de conception...
Prévoir d'envoyer une centaine de requêtes simultanées n'est pas viable, tu devrais penser à rapatrier toutes les données en une seule fois puis faire les traitements adaptés.
Je pense bien mais l'api de google ne le permet pas. J'aurais bien aimer envoyé tous un JSON bien formaté...

La solution que j'ai trouvé a été d'envoyé les requêtes, les une aprés les autres avec un setTimeout d'une seconde qui s’incrémente à chaque nouvelle connection et voila ^^

Merci pour vos réponses
sidacoq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 08h46   #5
sdamart
Membre du Club
 
Homme Sébastien DAMART
Développeur Web
Inscription : septembre 2012
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Sébastien DAMART
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2012
Messages : 29
Points : 65
Points : 65
Salut,
Dans l'hypothèse où vos données J.S.O.N sont stockées dans un tableau, 3 Solutions sont possible
1 - vous utilisez jQuery
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
index=-1
function sendRequest()
{
//Arreter le timer
clearTimeout(_timer);
// incrémenter l'index
index++
if(_request[index]!=undefined){
$.ajax({
url:[votre_url]
type:"POST",
data:_request[index],
success:function(data){
//ici votre code en cas de succes
_timer=setTimeout(function(){sendRequest();},1000);
}
})
}
}
2 - Vous n'utilisez pas jQuery et envoyer vos requêtes en mode synchrone
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function sendRequest(){
clearTimeout(_timer)
index++;
if(_request[index]!=undefined){
var xhr=new XMLHttpRequest();
xhr.open("POST",[votre url],false);
xhr.send(_request[index])
if(xhr.responseText!=undefined){
//votre code
_timer=setTimeout(function(){sendRequest();},1000);
}
}
}
3 - Vous n'utilisez jQuery et envoyer vos requête en mode asynchrone
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
function sendRequest(){
clearTimeout(_timer)
index++;
if(_request[index]!=undefined)
{
 var ajax=new XMLHttpRequest();
 ajax.open("POST",[votre url],true);
ajax.send(_request[index]);
ajax.onReadyStateChange=function(){
if(ajax.readyState==4){
if(ajax.statut!=500&&ajax.statut!=404){
//ici votre code
_timer=setTimeout(function(){sendRequest();},1000);
}
}
}
}
}
Evidemment je part du principe qu'il faille envoyer vos donnée JSON en POST, sans quoi la requête ne peut fonctionner correctement.
En résumer le principe est de stocker vos requête JSON dans un array en variable globale, créer un index global et d'utiliser un fonction itérative pour envoyer une à une chaque requête.

Bonne Chance
sdamart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 16h19   #6
sidacoq
Invité de passage
 
Inscription : février 2008
Messages : 47
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 47
Points : 4
Points : 4
waow super la réponse
Complète ...

Merci
sidacoq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 12h45   #7
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 055
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 055
Points : 1 430
Points : 1 430
Bonjour,
Je m'incruste, car je ne comprends rien a ce débat
Je croyais qu'Il était impossible d'envoyer des requêtes simultanées, puisque les programmes s'exécutent ligne par ligne !
Donc la fonction AJAX (ou autre) ne peut être appelée qu’une par une.
Ors cela crée une instance, a chaque fois, comme si la fonction se dédoublait.
En cela JavaScript utilise cette méthode au même titre que le langage "C" par exemple.
Si je calcule une fractale par AJAX, ce sera 5.000.000 d'appels en quelques secondes.

Alors j'ai mal compris
Ou bien c'est l'emploi des jQuery ou autres usines à gaz qui perturbent cette logique ?
A++
Christele
christele_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 13h40   #8
Bovino
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 18 157
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 42
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 18 157
Points : 65 033
Points : 65 033
Il est habituel pour la gestion des requêtes AJAX de créer une fonction créant l'objet XMLHttpRequest(), dans une version minimaliste, ce serait :
Code :
1
2
3
function creeXHR(){
    return new XMLHttpRequest();
}
ici, le new indique bien que cette fonction retourne à chaque fois une nouvelle instance de l'objet.
A partir de là, il est possible d'envoyer plusieurs requêtes AJAX distinctes et différenciées.
Ensuite, les navigateurs limitent le nombre de requêtes HTTP concurrentes, mais c'est une autre problématique.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 13h53   #9
sdamart
Membre du Club
 
Homme Sébastien DAMART
Développeur Web
Inscription : septembre 2012
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Sébastien DAMART
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2012
Messages : 29
Points : 65
Points : 65
L’inconvénient c'est l'objet XMLHttpRequest.
Selon la version d'internet explorer, l'objet ne peut pas être instancié.

Pas de panique, Seb connait une parade à ce problème.
Il existe plusieurs solutions plus ou moins similaires.

La première la moins agile consiste a tester l'instanciation de l'objet.
Code :
1
2
3
4
5
6
7
var ajax={};
try{
ajax=new XMLHttpRequest();
}catch(e){
ajax=new ActiveXObject("Microsoft.XMLHTTP");
}
[...]
La seconde consiste a factoriser l'instanciation par le biai d'une fonction
Code :
1
2
3
4
5
6
7
8
9
10
function XMLGetInstance()
var ajax={}
{
try{
ajax=new XMLHttpRequest();
}catch(e){
ajax=new ActiveXObject("Microsoft.XMLHTTP");
}
return ajax;
}
La dernière consiste a créer un pseudo objet qui fera comme jQuery
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function AJAX(p){
var url=p.url;
var type=(p.type!=undefined)?p.type:"GET";
var asynch=(p.asynch!=undefined)?p.asynch:false;
var data=(p.data!=undefined)?p.data:null;
var xhr={}
{
try{
xhr=new XMLHttpRequest();
}catch(e){
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(type,url,asynch);
xhr.send(data);
if(!asynch){
this.responseText=xhr.responseText;
}else{
xhr.onReadyStateChange=function(){
if(xhr.readyState==4){
if((xhr.statut!=505&&xhr.statut!=404){
p.success.call(xhr.responseText);
}
}
}
}
}
Pour l'appeler
Code :
1
2
3
4
5
6
7
8
ajax({
url:"monurl.php",
type:"POST",
data:"var1=val1&var2=val2",
success:function(data){
alert(data);
}
})
sdamart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 15h26   #10
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 055
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 055
Points : 1 430
Points : 1 430
Citation:
Envoyé par sdamart Voir le message
L’inconvénient c'est l'objet XMLHttpRequest.
Selon la version d'internet explorer, l'objet ne peut pas être instancié.
Etc.
Je crois rêver avec les anciens IE, on intencié
"new ActiveXObject('Microsoft.XMLHTTP');" et donc pas besoins d'astuces pour je ne sais quelle raison.
Depuis IE7 c'est encore plus simple puisque new XMLHttpRequest();
est intégré.
A++
Christele
christele_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 17h20   #11
sdamart
Membre du Club
 
Homme Sébastien DAMART
Développeur Web
Inscription : septembre 2012
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Sébastien DAMART
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2012
Messages : 29
Points : 65
Points : 65
Je préfère gérer ce genre de cas même s'il est peu probable. Les seuls cas pour lesquels je m'abstient se sont les cas hautement improbable.

De plus, pour ma part, j'utilise jQuery donc je me pose plus la question.
sdamart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 17h40   #12
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 055
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 055
Points : 1 430
Points : 1 430
Citation:
Envoyé par sdamart Voir le message
Je préfère gérer ce genre de cas même s'il est peu probable. Les seuls cas pour lesquels je m'abstient se sont les cas hautement improbable.
De plus, pour ma part, j'utilise jQuery donc je me pose plus la question.
Je ne sais pas si tu sais exactement ce qu'est jQuery
car en fait c'est un JavaScript compilé, qui utilises (ne t'y trompes pas),
tout simplement XMLHttpRequest();

A++
Christele
christele_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 19h14   #13
NoSmoking
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 5 107
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 5 107
Points : 8 820
Points : 8 820
Citation:
car en fait c'est un JavaScript compilé, qui utilises (ne t'y trompes pas),
tout simplement XMLHttpRequest();
jQuery n'est QUE du javascript et utilise encore, sûrement très rarement les ActiveXObject, compatibilité oblige.
Citation:
Envoyé par Extrait code jQuery
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Functions to create xhrs
function createStandardXHR() {
	try {
		return new window.XMLHttpRequest();
	} catch( e ) {}
}
 
function createActiveXHR() {
	try {
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
	} catch( e ) {}
}
// Create the request object
// (This is still attached to ajaxSettings for backward compatibility)
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
	function() {
		return !this.isLocal && createStandardXHR() || createActiveXHR();
	} :
	createStandardXHR;
NoSmoking est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 01h03   #14
christele_r
Membre Expert
 
Avatar de christele_r
 
Femme Christele Rubneau
Inscription : novembre 2009
Messages : 1 055
Détails du profil
Informations personnelles :
Nom : Femme Christele Rubneau
Âge : 40
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 1 055
Points : 1 430
Points : 1 430
Bonsoir,
Tu ne m'as pas bien lu, j'avais expliqué, deux messages plus haut, que plus pour longtemps car depuis IE7 XMLHttpRequest(); est intégré
A++
Christele
christele_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 07h46   #15
Bovino
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 18 157
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 42
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 18 157
Points : 65 033
Points : 65 033
Pour rappel, la place de IE6 est actuellement d'environ 0.5 %...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h39.


 
 
 
 
Partenaires

Hébergement Web