Newsgroup: it.comp.lang.javascript
Titolo: [LUNGO] Richieste XMLHttpRequest parallele

Salve a tutti!
In una webapp che sto sviluppando, utilizzo l'oggetto XMLHttpRequest 
per caricare l'elenco dei comuni una volta selezionata una provincia. 
Mi spiego meglio:
ho un form con una <select> dalla quale è possibile selezionare le 
province. all'evento onChange ho assegnato un javascript, il cui 
compito è quello di interrogare una JSP sul server (utilizzando 
XMLHttpRequest) per ottenere l'elenco dei comuni della provincia 
selezionata, e riempire conm questo un'altra <select> di comuni.
Il codice è il seguente:
function newlancio(url,codeWhere,select) {
    // cancello i vecchi valori dalla select di destinazione
    while(select.options.length){
	d = select.options.length - 1;
	select.remove(d);
    }
 
    var xmlttp=false;
    url += codeWhere;
 
    // istanzio l'XMLHttpRequest	
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (E){
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(E) {
            xmlhttp = false;
        }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined'){
        xmlhttp = new XMLHttpRequest();
    }
    // richiedo i dati
    xmlhttp.open("POST",url,true);
    var updater = new ComboBoxUpdater(xmlhttp, select);
    xmlhttp.onreadystatechange = updater.updateComboBox;
    xmlhttp.send();
}
function ComboBoxUpdater(loader,select) {
	var requester	= loader;
	var comboBox	= select;
 
	this.updateComboBox = updateCB;
 
	function updateCB() {
		if (requester.readyState == 4) {
			var risultato=requester.responseText;
   			risultato.replace(/\n+$|^\n+/g,'');
			arr=risultato.split("||");
 
   	        	for(x=0; x < arr.length; ++x) {
				if (!(arr[x].match(/^[\r\f\n]/))){
					valueText = arr[x].split("@@");
					comboBox.options[x] =  new Option();
					comboBox.options[x].value = valueText
[0];
					comboBox.options[x].text = valueText
[1];
				}
			}
		}			          
   	}
}
La classe ComboBoxUpdater l'ho creata perche' ho più sessioni 
contemporanee sull' XMLHttpRequest: infatti sono presenti "provincia di 
nascita" e "provincia di residenza", e volevo fare in modo da separare 
il caricamento di una dal caricamento dell'altra.
Invece accade che se avvio il caricamento dei comuni di nascita *prima* 
che il caricamento dei comuni di residenza sia terminato, ottengo lo 
stesso elenco, come se l'oggetto XmlHttpRequest fosse condiviso. 
Esempio:
1) selezione prov. nascita: bari, avvio caricamento
2) selezione prov. domicilio: belluno, avvio caricamento
3) ricezione dei comuni di Bari,
4) ricezione dei comuni di Belluno,
5) aggiornamento della <select> comune di nascita, con i dati di          
belluno,
6) aggiornamento della <select> comune di residenza, con i dati di          
belluno.
Questo non accade se attendo il caricamento di una combobox prima di 
avviare il caricamento dell'altra, il problema è che il cliente ha 
espressamente richiesto di evitare quest'attesa ;-)
Grazie fin d'ora a tutti coloro che mi aiuteranno!

Se provi a fare così funziona?
var updater = new ComboBoxUpdater(xmlhttp, select);
xmlhttp.onreadystatechange = function()
{
    updater.updateComboBox();
}
xmlhttp.send();
Facendo in questo modo crei una closure, per cui quando esegui la
funzione anonima l'oggetto updater è proprio lo stesso updater che hai
dichiarato qualche riga sopra.
Se invece lasci così:
xmlhttp.onreadystatechange = updater.updateComboBox;
stai passando una funzione che però sarà invocata con quale "this"?
Per essere sicuro puoi vare:
var updater = new ...
updater.name
 = "updater1"; // oppure passa il nome come parametro
E all'invocazione del metodo updateComboBox fai:
alert(
this.name
);
Gaetano