Newsgroup: it.comp.lang.javascript
Titolo: Ajax multiple call [ AIUUTOO!! ]

ciao raga,
ho un problema con una  applicazione che sto scrivendo AJAX based..
in pratica ho un pannello che mi deve fare il listing di determinati
oggetti ( una cosa banlissima )
a partire da una select mi faccio while che stampa
<DIV id="detailbox<? echo $i?>" style="display:inline"></DIV>
<script language="javsacript">
   loadLangSection('detailbox<? echo $i?>', '<? echo
$imageset['idimages']; ?>', '<? echo $_SESSION['path']?>')
</script>
la funzione loadLangSection e' una funzione che invoca una chiamata
AJAX che si referenzia ad un altro file.php che in pratica mi ritorna
del banalissimo HTML che io poi nella funz di onreadystatechange mi
vado a settare con una getElementById().innerHTML.
il problema e' che se io metto un alter davanti alla loadLangSection,
allora lui funziona alla perfezione e mi popola tutti i miei DIV, se
invece la lascio andare cs come l'ho scritta sopra...
nn c'e' verso e mi esegue il task solo x l'ultimo elemento
se nn avete capito una mazza della spiegazione di cs fa l'AJAX, allego
qui sotto lo snipplet:
   var http_request = false;
	 var targetDIV = null;
	 var RDY = true;
   function makeRequest(url, parameters, obj) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/html');
				}
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
			targetDIV = obj;
      http_request.onreadystatechange = alertContents;
      http_request.open('GET', url + parameters, true);
      http_request.send(null);
   }
   function alertContents() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            result = http_request.responseText;
             //alert(result);
						 document.getElementById(targetDIV).innerHTML = result;
         } else {
            alert('There was a problem with the request.');
         }
      }
   }
function loadLangSection(divID, imgID, path) {
	makeRequest('<? echo $_MODULE_ROOT; ?>/tools/getLangContents.php',
'?id='+imgID+'&divID='+divID+'&path='+path, divID);
}
le ho provate tutte: dal setTimeout a crearmi una funzione che implenta
una specie di lockking del processo....
N I  E N T E.. NN NE VUOLE SAPERE....
sn disperato.. :(
ringrazio anticipatamente chi mi puo' dare una manina.. 
thx

 }
Al di là di una serie di errori commessi e di brutture sparse, c'è una cosa
che non capisco: perché non fai tutto lato server? Cosa mi sfugge?
-- 
Nando [?]
Apostolo della Prova

 che non capisco: perché non fai tutto lato server? Cosa mi sfugge?
eheh.. x il semplice fatto che qst arnese deve fungere nel modo +
leggero possibile.. :)
in pratica, ora t svelo l'arcano ( a anche l'argatto se vuoi.. [
pessima.. ] ), questa web app e' un miserrimo pannello che t deve
xmettere d inserire delle immagini, e gia' qui sono discesi cristi e
madonne x implementare un workarond ajaxiano x fare l'upload senza
usare quello di scriptaculo visto che si impalla cn il norton x via di
una miriade di backslash che lo fanno sembrare un exploiting.. ad ogni
modo una volta inserite le immagini esiste una specie di "listato" dove
t fa vedere una thumb ed altre info..
quello che mi serve e' un modo x generare questo "listato" in modo tale
da invocare una funzione che mi disegni un singolo item + volte..
quindi in pratica invocarla in un iterazione [ lool ]. ed e' qui che
nasce il prob..
io avevo implementato una cosa del genere solo che in tutte le call che
faceva in pratica riusciva solo a portare a compimento l'ultimo task...
e' qui casca l'asino.... [ doh! ]
'pito?


 'pito?
Mica tanto... ti dico quello che ho capito, però, e i motivi della mia
domanda di prima (perché non fare tutto lato server?).
Il client richiede la pagina (quella di cui stiamo discutendo, chiamiamola
pagina.php) al server; il server pesca la pagina, esegue il codice php e
genera codice html contenente, tra l'altro, del javascript, quindi manda la
pagina al client; il client visualizza la pagina eseguendo il codice
javascript il quale non fa altro che inviare N richieste al server, diciamo
perché elabori la pagina httprequest.php, che le elabora inviando N
risposte al client il quale le usa per inserire dei contenuti nella pagina.
Stop. La struttura è questa:
client -> server: dammi pagina.php
/elaborazione server di pagina.php/
server -> client: eccoti pagina.php
(i=1..N) client -> server: elabora httprequest.php con i dati Di
/elaborazione server di httprequest.php N volte/
(i=1..N) server -> client: eccoti i risultati dell'elaborazione sui dati Di
Inoltre, le chiamate XmlHttpRequest sono usate in fase di caricamento della
pagina, non a seguito di azioni dell'utente né periodicamente, e non mi
pare che inviino dei dati al server che non fossero già noti o recuperabili
dal server stesso mentre veniva elaborata pagina.php.
Detto questo, mi chiedo: forse potresti fare in pagina.php le stesse
elaborazioni contenute nella pagina httprequest.php; in questo caso la
comunicazione client-server sarebbe:
client -> server: dammi pagina.php
/elaborazione server di pagina.php/
server -> client: eccoti pagina.php
Decisamente più leggero e lineare. Ad occhio, secondo me lo puoi fare;
ovviamente non posso esserne certo perché non so esattamente cosa fa
httprequest.php
Per concludere, se vuoi fare richieste XmlHttp multiple hai due
possibilità:
1) utilizzare un oggetto distinto per ogni richiesta (se sono molte
richieste non è proprio bello)
2) usare un unico oggetto ma, prima di inviare una richiesta, verificare
che la precedente sia stata completata


 che la precedente sia stata completata
3) usare modalità sincrona (che è l'unica che io uso, mai usata modalità
asincrona)
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 asincrona)
"The right tool for the right job". La modalità asincrona è utile per alcune
operazioni che con la modalità sincrona non potresti mai fare, in quanto
"congeli" il browser. Sono complementari, non interscambiabili.
Ciò non toglie, ovviamente, che puoi benissimo non usare una delle due se
nelle tue pagine non hai casistiche che la richiedono.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 Sarebbe piů elegante 
IMVHO, non č una questione di eleganza. Al massimo, questa , č un "effetto
collaterale". :)


 "congeli" il browser. Sono complementari, non interscambiabili.
sì, ma resta il fatto che in 10 anni di uso di xmlhttp non ho trovato un
solo caso in cui mi sia risultata utile (mi lascia in realtà perplesso il
fatto che ajax venga pubblicizzato SOLO come asincrono, mentre IMHO al 99%
dei casi servirebbe sincrono. E in questo modo la gente crede che xmlhttp
== ajax == asincrono ...)
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 == ajax == asincrono ...)
Se avessero coniato un termine come "sjax" o "syjax", ti assicuro che non si
sarebbe diffuso così come invece è successo. :)
L'immagine amico mio. E' tutto. E AJAX è appunto questo, un nome d'immagine.
Un "prodotto" da vendere. E quindi la realtà tecnica si è semplicemente
piegata al marketing, nella scelta del nome. :)


 sarebbe diffuso così come invece è successo. :)
:-) addirittura ... dici?
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 asincrona)
Il punto 3 è incluso nel punto 2... mica ho specificato il meccanismo di
controllo del flusso, ho solo detto che serve!
/mode "arrampicatore" off/


 collaterale". :)
Parli dei tag scritti in maiuscolo e dell'attributo language o in generale
della mescolanza tra markup, presentazione e comportamento?


 vantaggi)
Se hai gia' mandato una richiesta asincrona al sito i click seguenti su
quel tasto non dovrebbero ripeterla :-)
Un esempio di uso di chiamate a/sincrone potrebbe essere un gioco online di
tipo adventure o RPG (turn based) in cui i comandi del player sono inviati
in modo sincrono e l'aggiornamento dello "stato" del gioco e/o gli eventi
non provocati dal player sono ricevuti in modo asincrono.
'bye

 :-) addirittura ... dici?
Eheh. :)


 della mescolanza tra markup, presentazione e comportamento?
Alla mescolanza. :)


 non provocati dal player sono ricevuti in modo asincrono.
Per l'appunto, le operazioni di background. :)


 in modo sincrono 
A pensarci meglio anche questi sarebbero da gestire in modo asincrono :-)
'bye

 non provocati dal player sono ricevuti in modo asincrono.
io dicevo solo che, praticamente, non mi è mai capitato...poi che in
particolari circostanze serva è un altro discorso. Forse perché io parlo
del mio mondo, dove xmlhttp è usato SEMPRE per gestione sql (update,
insert, reperimento dati etc), oppure per altre operazioni sempre richieste
dal client (invio mailing-list, p.e.)
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 A pensarci meglio anche questi sarebbero da gestire in modo asincrono :-)
IMVHO, č cosě. Sarebbe un approccio similare a quello suggerito a Nando
durante lo sviluppo della sua chat.
Bufferizzando i comandi impartiti, e inviandoli al server quando viene
scatenata la richiesta in background dell'aggiormento. Se ci sono operazioni
in coda, le invia e ripulisce la coda.


 dal client (invio mailing-list, p.e.)
Il reperimento dati da sql è un attività dove, generalmente (poi va vista la
casistica) è più indicata la modalità asincrona.
Ovviamente se si tratta di un singolo valore (esempio, l'utente avvalora un
campo e in un altro deve apparire la descrizione collegata), va benissimo la
sincrona. Ma quando aumenta la mole di dati richiesti, oppure può
"virutalmente" aumentare in futuro, allora si dovrebbe passare ad utilizzare
la modalità asincrona.


ecco ok, esattamente cn si usa Ajax in modo sincrono?
sn un novello della xmlHttprequest.. :P
ah si beh poi le storie di mescolanza css, html, cazzi mazzi sn solo x'
voglio prima far andare la struttura e la meccanica e poi metto a posto
l'estetica..
cmq x risp a nando..
nn volevo fare in qst modo x il semplice fatto che, se io ricaricassi
tutta la pag in quella maniera, poi lui mi costringerebbe a ricaricarmi
tutte le thumz.. [ pesante! ]
btw.. se qcl anima pia mi puo' dare ref di qlc snipplet explicativo di
ajax in modo SINCRONO o come mi illustrava prima nando da usare nel
modo di fare prima un check sulla terminata chiamata precedente cs che
mi possa fare un idea..
grassie.. :D

 casistica) è più indicata la modalità asincrona.
assolutamente non d'accordo ma fa niente, dipende dalla logica di sviluppo.
io blocco ASSOLUTAMENTE tutto (stiamo parlando di un blocco che, quando è
molto lento, si attesta sui 2 secondi), attendo il messaggio di ritorno, lo
analizzo in cerca di errori, avviso se ci sono errori indicando l'azione da
intraprendere etc etc. 


 ecco ok, esattamente cn si usa Ajax in modo sincrono?
ajax? ajax, in quanto tale, è asincrono ... se intendi xmlhttp puoi partire
da qua: 
http://www.criosoftware.it/defaultTIxmlhttp.aspx


 del mio mondo, dove xmlhttp è usato SEMPRE per gestione sql (update,
Anche un RPG richiede una gestione dei dati, e se questi sono in un
database di SQL. Ho capito cosa indendi comunque :-)
'bye

 da qua: 
http://www.criosoftware.it/defaultTIxmlhttp.aspx
ok thanks...
qst mi ha risolto una parte dei miei dubbi in merito alla questione..
solo adesso mi resta ancora un dubbio, ossia cio' d cui parlavo prima:
come fare ad eseguire un numero esiguo ( ma anche solo 2, x' no.. ) di
chiamate ajax e riuscire a farle arrivare tutte a termine?
Visto che adesso cm adesso io lo faccio e mi porta a compimento solo
l'ultima richesta eseguita.. 
grassiee..

 tutte le thumz.. [ pesante! ]
E no, non ti capisco. Le chiamate alla funzione loadLangSection le fai man
mano che la pagina viene renderizzata, quindi una sola volta *mentre la
pagina è in fase di caricamento*: dove starebbere 'ste thumb che dovrebbe
ricaricare? Essendo la pagina in caricamento, *comunque* le deve caricare.
Comunque continuo a non capire cosa devi fare; se hai pubblicato le pagine
in questione, potresti postarle così ci si capisce meglio. Se poi vuoi per
forza usare XmlHttpRequest per fare ciò che devi, allora usalo in modalità
sincrona: ad occhio credo che basti sostituire, nella funzione makeRequest,
la linea
  http_request.open('GET', url + parameters, true);
con
  http_request.open('GET', url + parameters, false);


 intraprendere etc etc.
Cosa che puoi fare benissimo, in molti casi meglio, usando la modalità
asincrona. Almeno per quanto riguarda il recupero di dati da database (che
non sia un valore unico, come accennavo precedentemente).
Inoltre puoi parallelizzare lavoro e operazioni, cosa che con la richiesta
sincrona non puoi assolutamente fare.


 aumentare col tempo
Non possono aumentare col tempo, per come lo uso io
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 ah sì?
Mi ero perso un pezzo:
Nel momento dell'invio della chiamata disbiliti il "button" o setti un flag
che controlli prima di inviare la seguente chiamata, flag azzerato quando
la chiamata asincrona e completata.
'bye

 Non possono aumentare col tempo, per come lo uso io
Ma tu non lo usi per lo sviluppo di "web application" come applicazioni
desktop, allora. Utilizzi XmlHttpRequest solo per fare quello che potresti
fare anche alla "vecchia maniera", solo in modalità sincrona.
Però così stai minimizzando XmlHttpRequest.. Potrebbe fare molto di più. :)


 la chiamata asincrona e completata.
aaaaahhhh ok ... anche dal msg di Zer0 sembrava che non inviasse una
chiamata se ce ne era già in corso un'altra (e ciò non mi risultava
proprio)
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 durante lo sviluppo della sua chat.
Yep, esattamente. Se nel gioco ci sono eventi indipendenti dal giocatore si
deve sempre usare l'asincrono, il mondo non si ferma solo perche' il
giocatore invia comandi :-)
'bye

 proprio)
Infatti non mi riferivo al comportamento di XmlHttpRequest ma alla tua
applicazione che deve controllare come e quando usare l'oggetto.
'bye

 Però così stai minimizzando XmlHttpRequest.. Potrebbe fare molto di più. :)
vedi sopra: oggigiorno sinceramente penserei a tornare a windows-form
(abbandonate negli anni '90 perché i linguaggi tipo vb erano troppo un
pacco per le differenze tra i vari s.o., l'installazione, l'aggiornamento
etc, tutte cose superate con l'ambiente .net) (peraltro ci ho già pensato e
mi sono mangiato le mani: ho rifatto la intranet 1 annetto fa, se dovessi
rifarla adesso forse non avrei dubbio sulle windows-form...)


 applicazione che deve controllare come e quando usare l'oggetto.
Ma neanche io difatti. :)


 rifarla adesso forse non avrei dubbio sulle windows-form...)
Leggi su. :)


 Ma se non ci pensa quasi più nemmeno la Microsoft..! :P
dici? il dilemma non lo ho approfondito perché oramai sono in web-form, ma
la tentazione è questa...
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 la tentazione è questa...
Aspetta che escano i nuovi framework, prima di mettere mano alla intranet,
fidati. :)
