Newsgroup: it.comp.lang.javascript
Titolo: XMLHttpRequest asincrono da sicronizzare

Ho questa situazione... da cui non so uscirne da solo :-(
Con l'oggetto XMLHttpRequest faccio 2 richieste asincrone a due URL diversi.
La risposta di ognuno č un documento XML.
Fino ad ora, trovandomi a gestire una risosa soltanto, operavo piů o meno
cosi: (scrivo per Mozilla).
function interrogaServer(server,qrystring) {
    var req = new XMLHttpRequest();
    req.open("post",server+qrystring,true);
    req.send(outstring);
    req.onload = req_onload;
};
function req_onload() {
    switch(req.readyState) {
              case 1,2,3:
                  break;
              case 4:
                      if(req.status !=200) {
                            return false;
                       } else {
                            alert(req.responseText);
                            return true;
                       }
                  break;
         };
 };
function mergeXML(docXML1,docXML2) {
        //do something
};
Il fatto che devo interrogare due URL diversi contemporaneamente mi crea non
pochi problemi: infatti con questa struttura, supponendo di richiamare due
volte la funzione interrogaServer(server,qrystring), non riesco a fare in
modo che una data funzione mergeXML sia attivata soltanto quando entrambe le
richieste siano state ultimate.
Spero che riusciate ad  aiutarmi.
In pratica dovrei fare in modo che la funzione mergeXML sia attivata
soltanto quando entrambe le richieste req_onload abbiano dato esito.
Grazie mille per l'aiuto.
--Gabriele

 soltanto quando entrambe le richieste req_onload abbiano dato esito.
Allora, ammetto che non ho letto attentamente il codice, ma mi sembra che
il tuo sia piu' un problema da risolvere tramite logica piu' che con la
tecnica.
Dimmi se sbaglio qualcosa con il mio ragionamento, ma io non vedo grossi
problemi. Hai due documenti, caricati in modo asincrono, il che significa
che molto probabilmente uno verra' caricato prima dell'altro.
Basta che nella funzione che assegni all'evento onload, verifichi se sono
caricati entrambi. Questo lo puoi fare se usi una flag globale, oppure se
gia' i documenti XML hanno scope globale, che entrambi siano settati.
Questo si traduce in qualcosa del tipo (riprendendo il tuo codice):
var iDocLoaded=0;
function req_onload() {
	switch(req.readyState) {
		case 1,2,3:
			break;
		case 4:
			if(req.status !=200) {
				return false;
			} else {
				if (iDocLoaded++==0){
				/* e' il primo documento XML, imposta la variabile e basta */
				}else{
				/* siamo al secondo: imposta la var e chiama la funzione di merge */
				mergeXML(..);
				}
				return true;
                       }
		break;
         };
 };
Le possibilita' sono tante, molto dipende da come hai impostato la logica
applicativa del tuo programma, non e' detto che questa sia la soluzione
migliore, ma spero che almeno possa darti uno spunto.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'
che sara', non cambia cio' che e'.
Sta a te decidere poi come prendere questa cosa,se logorarsi per un passato
che non puoi cambiare, invece di prendere tutto il bene che il presente ti
offre." ()

> var iDocLoaded=0;
Il fatto č che mi ero incartato con funzioni come setTimeout, setInterval
che avevo perso di vista la soluzione
piů facile.... la variabile globale...
Cmq, grazie mille per il suggerimento.
--Gabriele