Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema con XMLHttpRequest

    Ciao a tutti
    sto creando una funzione(madre) javascript che all'interno va a richiamare un'altra funzione(ajax) che manda i dati ad una pagina asp e la risposta mi serve all'interno poi della funzione madre

    per richiamare la funzione ajax scrivo così (nella funzione madre)

    codice:
                             prendoDato=sendRequest(url,handleRequest);
    			alert(" prendoDato  " + prendoDato)

    mentre la funzione ajax è questa

    codice:
    
    
    
    function handleRequest(req) {
    	//var writeroot = [some element];
    	//writeroot.innerHTML = req.responseText;
    //	alert("req " +req)
    }
    
    
    
    
    
    
    
    
    
    
    function sendRequest(url,callback,postData) {
    	var req = createXMLHTTPObject();
    	if (!req) return;
    	var method = (postData) ? "POST" : "GET";
    	req.open(method,url,true);
    //	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
    	
    		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    	if (postData)
    		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    	req.onreadystatechange = function () {
    		alert('HTTP error ' + req.status);
    		if (req.readyState != 4) return;
    		if (req.status != 200 && req.status != 304) {
    //			alert('HTTP error ' + req.status);
    			return;
    		}
    		if (req.status == 200)
    		{
    			alert("req " +req.responseText)
    			return req.responseText
    		}
    		callback(req);
    		
    	}
    	if (req.readyState == 4) return;
    	req.send(postData);
    }
    
    
    var XMLHttpFactories = [
    	function () {return new XMLHttpRequest()},
    	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
    	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
    	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
    ];
    
    
    function createXMLHTTPObject() {
    	var xmlhttp = false;
    	for (var i=0;i<XMLHttpFactories.length;i++) {
    		try {
    			xmlhttp = XMLHttpFactories[i]();
    		}
    		catch (e) {
    			continue;
    		}
    		break;
    	}
    	return xmlhttp;
    }


    il problema che ho è questo io richiamo la funzione ajax
    e vorrei mettere il valore di ritorno in una variabile nella funzione madre
    il problema e che l'ajax funzione ma passa il valore undefined alla variabile

    per verificare ho messo degli alert e praticamente
    mi esce prima l'alert che si trova dopo la chiamata alla funzione ajax
    e poi gli alert che sono nella funzione ajax, che dopo intercetta il valore, ma che non riesce più a passarlo alla variabile prendoDato

    ho provato nella funzione madre a mettere un ciclo
    ma mi va in loop eterno

    codice:
                         do {
    				
    				cccc=sendRequest(url,handleRequest);
    				alert("cccc "+cccc)
    			}
    			while (cccc !== "undefined");


    avete qualche suggerimento da darmi?
    Grazie mille in anticipo

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, il problema sta nel fatto che AJAX è asincrono, cioè il valore viene restituito solo dopo la risposta dal server.
    Nel tuo caso la tua funzione sendRequest non può restituire niente nel momento in cui la stai richiamando perché il risultato viene gestito nel gestore di evento onreadystatechange che, appunto, è asincrono.

    Puoi risolvere in diversi modi anche a seconda di quello che serve a te.
    Puoi mantenere il funzionamento asincrono e strutturare la tua funzione in modo che onreadystatechange lanci una funzione di callback o qualcosa di simile che restituisca il valore da applicare poi alla tua variabile.
    Oppure puoi impostare AJAX per un funzionamento sincrono. In tal caso non hai bisogno del gestore onreadystatechange, ma l'effetto collaterale è che il browser si "blocca" finché non riceve risposta dal server.

    Nel caso puoi trovare ulteriori suggerimenti e soluzioni sulle svariate discussioni già affrontate nel forum. Basta una ricerca con termini tipo ajax sincrono. Oppure attendi eventuali altre risposte.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    Un' altra soluzione potrebbe essere quella di farti tornare dalla funzione sendRequest l'oggetto XMLHttpRequest e quindi gestire la funzione di callback(onready...) direttamente nella funzione madre. Ti sconsiglio invece l'uso di chiamate sincrone proprio per il problema segnalato da KillerWorm.

    Mi accodo, cerca nel forum è un argomento già trattato diverse volte.

  4. #4
    Intanto grazie per la risposta

    Ho inserito uno script sincrono
    l'alert scatta dopo, ma mi ritorna undefined

    <code>

    function call_ajax(){
    $.ajax({
    type: "POST",
    url: "/include/ajaxTempoDistanza.asp",
    dataType: "html",
    data: "origine=43.608896,3.880175&destintario=43.60736,3 .8939890000000332&stampa=no",
    async: false,
    cache: false,
    timeout:30000,
    success: function(html){
    alert("html " + html);
    return html


    }
    });
    }



    sp=call_ajax()
    alert(" sp " + sp)


    </code>



    oltre a questo messaggio nella console javascript

    Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.

    onestamente non so fare la chiamata in callback, provo a cercare qualcosa, o se mi puoi dare una dritta
    Grazie

  5. #5
    Dimenticavo
    io ero partito ieri da questa soluzione qui
    sempre ajax ma con una diversa funzione
    dove ho cercato di fare due cose, che sono quelle che vedete nello script di seguito
    ovvero
    o provare a scrivere il valore in un form nella pagina o metterlo in una variabile globale
    nel secondo caso, lo script madre non si accorge della variazione della variabile,
    anche se metto un ciclo
    nel primo caso, si riempe il campo del form ma dopo lo script madre ha utilizzato la funzione



    var tempoDistanza="";


    function CalcolaTempoDistanza(origine,destintario,stampa)
    {


    if(window.XMLHttpRequest)
    {
    oRequest = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {
    oRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }


    oRequest.open("POST", "/include/AjaxTempoDistanza.asp", true);
    oRequest.onreadystatechange = CheckCalcolaTempoDistanza;


    oRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    oRequest.send("origine="+ origine +"&destintario=" + destintario);
    //alert("origine="+ origine +"&destintario=" + destintario)


    }


    function CheckCalcolaTempoDistanza(stampa)
    {
    if(oRequest.readyState == 4)
    {
    if(oRequest.status == 200)
    {
    //alert("oRequest.responseText " +oRequest.responseText)

    //alert(oRequest.responseText.indexOf("non valido"))
    // alert( oRequest.responseText.indexOf("utilizzato"))

    if (stampa=="si")
    {
    document.getElementById("TempoDistanza").innerHTML = oRequest.responseText
    }
    else
    {

    document.getElementById("TempoDistanza").value = oRequest.responseText
    tempoDistanza=oRequest.responseText
    }



    }
    else
    {
    document.getElementById("TempoDistanza").innerHTML = "Asychronous Error";
    }
    }
    }

  6. #6
    Risolto!!!
    vi ringrazio per i suggerimenti
    posto il codice dopo aver letto varie cose su questo forum e un pò in giro
    A dire il vero, non ho trovato qualcosa che spiega bene e dettagliatamente come funziona e come usarlo, o come creare una funzione exnovo, quindi se qualcuno ha un link a titolo di studio da girare dove è ben spiegato come utilizzare il callback in questo e in altri casi, mi farebbe una cortesia

    la funzione la creo così


    function call_ajax(urlPage,postdata){
    $.ajax({
    type: "POST",
    url: urlPage,
    dataType: "html",
    data: postdata,
    async: false,
    cache: false,
    timeout:30000,
    success: function(html){
    //alert("html " + html);
    //return html

    obj = html


    }
    });


    if(obj =='"empty"'){
    return false;
    }else{
    return obj;
    }

    }

    e la richiamo così

    url="/include/ajaxTempoDistanza.asp"
    postData="origine=43.608896,3.880175&destintario=4 3.60736,3.8939890000000332&stampa=no"

    sp=call_ajax(url,postData)
    alert(" sp " + sp)

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.