Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Parro
    Registrato dal
    Jun 2003
    Messaggi
    18

    Piu' chiamate consecutive con AJAX

    Ciao a tutti,
    ho un problema con un mio script Ajax, che interroga il db delle spedizioni FeDEx, tramite le loro API, riceve un file XML, verifica se il pacco e' stato consegnato e lo scrive dentro ad un <div>. Ora, il tutto funziona tranquillamente se lancio la funzione una volta e, prima di lanciarla di nuovo aspetto che la prima abbia finito. Se invece provo a verificare lo stato di due pacchi uno dopo l'altro, mi riceve i risultati solo dell'ultimo...

    Il mio scopo era quello di creare una pagina con un elenco di una trentina di pacchi, la pagina si carica, e nel mentre lancio una chiamata per ogni spedizione e un po' alla volta mi si popola dei risultati sullo stato della spedizione.

    Ho provato a fare una funzione sincrona, funziona, ma il caricamento si blocca ad ogni chiamate di Ajax, e si perde il vantaggio del caricamento parziale.

    In sostanza, c'e' un modo per eseguire una chiamata asincrona ad una stessa funzione piu' volte, senza aspettare che sia finita (visto che i tempi di risposta del server sono di qualche secondo)?

    Posto il codice per chiarezza:
    codice:
    function DeliveredXml(awb) {
    	XmlHttp = XmlHttpCreate();
    	if (awb!=''){
    		file='DeliveredXml';
    		url='DeliveredXml.php?awb='+awb;
    		document.getElementById('delivered'+awb).innerHTML='';
    
    		att_img=document.createElement('IMG');
    		att_img.setAttribute('src','searching.gif');
    		att_img.setAttribute('align','absbottom');
    		document.getElementById('delivered'+awb).appendChild(att_img);
    				
    		XmlHttp.open('get', url, true);
    		XmlHttp.onreadystatechange = eval('response'+String(file));
    		XmlHttp.send(null);
    		
    	}else{
    		alert('Devi inserire un valore');
    	}
    }
    
    function responseDeliveredXml() {
    	if(XmlHttp.readyState == 4){
    		if (XmlHttp.status == 200) {
    	//		alert(respText = XmlHttp.responseText);
    			var respXML = XmlHttp.responseXML;
    			
    			IDcella='delivered'+respXML.getElementsByTagName('TrackingNumber')[0].firstChild.nodeValue;
    			svuotaEl(IDcella);
    
    			if(respXML.documentElement.nodeName=='FDXTrackReply'){
    //				alert(respXML.getElementsByTagName('ScanDescription')[0].firstChild.nodeValue);
    				document.getElementById(IDcella).innerHTML=respXML.getElementsByTagName('ScanDescription')[0].firstChild.nodeValue;
    			}else if(respXML.documentElement.nodeName=='TrackResponse'){
    				Activity=respXML.getElementsByTagName('Activity')[0];
    //				alert(Activity.getElementsByTagName('Description')[0].firstChild.nodeValue);
    				document.getElementById(IDcella).innerHTML=Activity.getElementsByTagName('Description')[0].firstChild.nodeValue;
    			}
    		}else{
    			alert("There was a problem retrieving the XML data:\n" + XmlHttp.statusText);
    		}
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    prova (non ho provato però) a mettere:

    var XmlHttp = XmlHttpCreate();

    (cioè aggiungi var e dichiari la variabile non globale)

    poi sostituisci

    XmlHttp.onreadystatechange = eval('response'+String(file));

    con qualcosa del genere:
    codice:
    XmlHttp.onreadystatechange = function() 
    							{ 
    								//target(objHTTP) 
    								if (objHTTP.readyState == 4) 
    								{
    									if (objHTTP.status == 200 || objHTTP.status == 0)
    									{
    										target(objHTTP);
    									}											
    
    									else {alert("ERRORE NELLA TRASMISSIONE DATI!" + "\n\nreadyState:"+ objHTTP.readyState +"\nstatus: "+objHTTP.status + "\nstatusText: " + objHTTP.statusText + "\n\nheaders:\n"+ objHTTP.getAllResponseHeaders()); return;}
    								}
    							};
    dove target è un parametro della funzione DeliveredXml


    la funzione di postback sarà allora per esempio:
    function callback(XmlHttp)


    Allora, io la uso e mi funziona, ma se è razionale o corretta, questo è argomento per chi è meglio preparato di me.

    In alternativa, si può usare un oggetto, ossia, al posto di creare una funzione DeliveredXml, crei un oggetto DeliveredXml(url, callback, parametri)

    che si richiamerà con:

    new DeliveredXml(url, callback, parametri)

    la funzione callback può essere per esempio:

    function callback()
    {
    var t = this.responseText;

    }
    etc. etc.
    Pietro

  3. #3
    Utente di HTML.it L'avatar di Parro
    Registrato dal
    Jun 2003
    Messaggi
    18
    Funziona!!!
    Il primo metodo, quando riesco provo a fare una bella classe, cosi' vado tranquillo.

    Grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.