Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: return funzione

  1. #1
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345

    return funzione

    Io ho due funzioni e in una eseguo l'altra assegnando poi a una variabile il valore di ritorno dell'altra funzione, solo che non va. Questo è il codice:
    codice:
    function inviaPOST(pagina, dati) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4) {
    				if(ajax.status == 200) {
    					return ajax.responseText;
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    			}
    		}
    	}
    }
    
    
    function controlloErrore(id_elem, id_span) {
    	var risposta = null;
    	risposta = inviaPOST('controllo.php', 'azione='+id_elem + '&' + id_elem+'='+prendiElementoDaId(id_elem).value);
    	if (risposta) {
    		if (risposta != '') {
    			prendiElementoDaId(id_elemento).className = 'textbox2';
    			cambiaTesto(id_span, risposta);
    		}else{
    			prendiElementoDaId(id_elemento).className = 'textbox1';
    			cambiaTesto(id_span, '');
    		}
    	}
    	return risposta;	
    }
    La prima funzione la esegue senza problemi e se io metto prima di "return ajax.responseText;" un alert mi mostra correttamente il valore, ma se invece io metto alert(risposta) nella seconda funzione dopo "risposta = inviaPOST('controllo.php', 'azione='+id_elem + '&' + id_elem+'='+prendiElementoDaId(id_elem).value);" allora mi appare "undefined".

    Come mai la prima funzione non restituisce correttamente il valore che poi viene assegnato a "risposta"?

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    probabilmente dipende dal fatto che la chiamata ajax è asincrona
    quindi quando valuti risposta nell' if, questa non è ancora definita

    prova a cambiare
    ajax.open("post", pagina, true);


    con
    ajax.open("post", pagina, false);


    se funziona, allora il problema sta lì
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Originariamente inviato da fcaldera
    probabilmente dipende dal fatto che la chiamata ajax è asincrona
    quindi quando valuti risposta nell' if, questa non è ancora definita

    prova a cambiare
    ajax.open("post", pagina, true);


    con
    ajax.open("post", pagina, false);


    se funziona, allora il problema sta lì
    Niente, la prima funzione continua a non restituirmi il valore.

  4. #4
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Non c'è nessuno che mi possa aiutare?

  5. #5
    Dagli un provotto:
    codice:
    function inviaPOST(pagina, dati, id_elem, id_span) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4) {
    				if(ajax.status == 200) {
    					var risposta = ajax.responseText;
    					if (risposta != '') {
    					    prendiElementoDaId(id_elem).className = 'textbox2';
    					   cambiaTesto(id_span, risposta);
    					}else{
    					   prendiElementoDaId(id_elem).className = 'textbox1';
    					   cambiaTesto(id_span, '');
    					}
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    			}
    		}
    	}
    }
    Attenzione alla funzione inviaPOST(pagina, dati, id_elem, id_span): ha due parametri in più!

    HTH
    Zappa
    [PC:Presario 2515EU][Cpu:P4@2.3GHz][Ram: 512M][HDU:80G@5400 RPM]
    [Wireless:LinkSys][OS: Ubuntu 9.04 - Jaunty Jackalope]

  6. #6
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Originariamente inviato da homezappa
    Dagli un provotto:
    codice:
    function inviaPOST(pagina, dati, id_elem, id_span) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4) {
    				if(ajax.status == 200) {
    					var risposta = ajax.responseText;
    					if (risposta != '') {
    					    prendiElementoDaId(id_elem).className = 'textbox2';
    					   cambiaTesto(id_span, risposta);
    					}else{
    					   prendiElementoDaId(id_elem).className = 'textbox1';
    					   cambiaTesto(id_span, '');
    					}
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    			}
    		}
    	}
    }
    Attenzione alla funzione inviaPOST(pagina, dati, id_elem, id_span): ha due parametri in più!

    HTH
    Zappa
    Grazie dell'aiuto, così funziona correttamente, solo che volevo avere due funzioni distinte per usare inviaPOST anche altre volte per altri scopi.
    Comunque adesso ho scoperto in cosa consiste l'errore ma non so come risolverlo, mi puoi aiutare?
    Ora ho fatto così e ho aggiunto un alert() per testare:
    codice:
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if (ajax.readyState === 4)		
    				if(ajax.status == 200) {
    					var risposta = decodeURIComponent(ajax.responseText);
    					alert(risposta); // questo alert mi mostra il valore giusto					
    					return risposta;
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    		}
    	}
    
    function controlloErrore(id_elem, id_span) {
    	var risposta = null;
    	risposta = inviaPOST('controllo.php', 'azione='+id_elem + '&' + id_elem+'='+prendiElementoDaId(id_elem).value);
    	alert(risposta); // questo alert mi mostra "undefined"
    	if (risposta) {
    		if (risposta != '') {
    			prendiElementoDaId(id_elemento).className = 'textbox2';
    			cambiaTesto(id_span, risposta);
    		}else{
    			prendiElementoDaId(id_elemento).className = 'textbox1';
    			cambiaTesto(id_span, '');
    		}
    	}
    	return risposta;
    }
    Mettendo i due alert che vedi ho notato che l'alert della funzione controlloErrore appare immediatamente (con scritto "undefined") e dopo 1 o 2 secondi appare l'alert della prima funzione (con scritto il valore corretto).
    In pratica la funzione controlloErrore non aspetta la risposta di inviaPOST e agisce immediatamente, prima che venga eseguito:
    codice:
    ajax.onreadystatechange = function() {
    			if (ajax.readyState === 4)		
    				if(ajax.status == 200) {
    					var risposta = decodeURIComponent(ajax.responseText);
    					alert(risposta); // questo alert mi mostra il valore giusto					
    					return risposta;
    Come risolvere?

  7. #7
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924

    Re: return funzione

    Ripeto: il problema è che mentre stai ancora aspettando la risposta (asincrona) viene eseguito l'if, per cui all'interno della funzione inviapost otterrai il valore correttamente, mentre al di fuori invece no

    ti basta definire una funzione di callback, ad es.


    codice:
    function inviaPOST(pagina, dati, callback) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4) {
    				if(ajax.status == 200) {
    					return callback(ajax.responseText);
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    			}
    		}
    	}
    }
    
    
    function controlloErrore(id_elem, id_span) {
    	var risposta = null;
    	inviaPOST('controllo.php', 'azione=... , function(risposta) {
    	      if (risposta) {
    		    if (risposta != '') {
    			prendiElementoDaId(id_elemento).className = 'textbox2';
    			cambiaTesto(id_span, risposta);
    		    }else{
    			prendiElementoDaId(id_elemento).className = 'textbox1';
    			cambiaTesto(id_span, '');
    		    }
    	      }
          });
    }
    la parte in rosso la cambi di volta in volta, facendo eseguire funzioni diverse con la risposta
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  8. #8
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345

    Re: Re: return funzione

    Originariamente inviato da fcaldera
    Ripeto: il problema è che mentre stai ancora aspettando la risposta (asincrona) viene eseguito l'if, per cui all'interno della funzione inviapost otterrai il valore correttamente, mentre al di fuori invece no

    ti basta definire una funzione di callback, ad es.


    codice:
    function inviaPOST(pagina, dati, callback) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4) {
    				if(ajax.status == 200) {
    					return callback(ajax.responseText);
    				}else{
    					alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    			}
    		}
    	}
    }
    
    
    function controlloErrore(id_elem, id_span) {
    	var risposta = null;
    	inviaPOST('controllo.php', 'azione=... , function(risposta) {
    	      if (risposta) {
    		    if (risposta != '') {
    			prendiElementoDaId(id_elemento).className = 'textbox2';
    			cambiaTesto(id_span, risposta);
    		    }else{
    			prendiElementoDaId(id_elemento).className = 'textbox1';
    			cambiaTesto(id_span, '');
    		    }
    	      }
          });
    }
    la parte in rosso la cambi di volta in volta, facendo eseguire funzioni diverse con la risposta
    Dal mio ultimo post infatti mi sono reso conto che avevi ragione, ma non sapevo come risolvere. Interessante la tua soluzione, non sapevo che ad una funzione si potesse inviare come parametro un'altra funzione (come sono ignorante ).
    Grazie.

    Un ultima domanda: ma se io volessi mettere un return risposta alla fine della funzione controlloErrore poi va? Oppure in che punto la devo inserire?

  9. #9
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    poi fare

    return true (o false)

    appena prima dell'ultima graffa chiusa in rosso

    però il valore di ritorno lo gestisci qui

    ...
    if(ajax.status == 200) {
    if (callback(ajax.responseText)) {

    }
    else {

    }
    }
    ...
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  10. #10
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Originariamente inviato da fcaldera
    poi fare

    return true (o false)

    appena prima dell'ultima graffa chiusa in rosso

    però il valore di ritorno lo gestisci qui

    ...
    if(ajax.status == 200) {
    if (callback(ajax.responseText)) {

    }
    else {

    }
    }
    ...
    Quindi dovrebbe andare bene così:
    codice:
    function inviaPOST(pagina, dati, callback) {
    	if (ajax) {
    		// inizializzo la richiesta in post
    		ajax.open("post", pagina, true);
    		
    		// imposto il giusto header
    		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    		ajax.setRequestHeader("connection", "close")
    		
    		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
    		// dati = escape(dati);
    		ajax.send(dati);
    		
    		ajax.onreadystatechange = function() {
    			if(ajax.readyState === 4)			
    				if(ajax.status == 200)
    					var errore = true;
    					if (callback(ajax.responseText) == '') 
    						errore = false;
    				else{
    					//alert("Operazione fallita, errore numero " + ajax.status);
    					return null;
    				}
    		}
    	}
    }
    
    function controlloErrore(id_elem, id_span) {
    	var risposta = null;
    	inviaPOST('controllo.php', 'azione='+id_elem + '&' + id_elem+'='+prendiElementoDaId(id_elem).value, function(risposta){	
    		if (risposta != '') {
    			prendiElementoDaId(id_elem).className = 'textbox2';
    			cambiaTesto(id_span, risposta);
    		}else{
    			prendiElementoDaId(id_elem).className = 'textbox1';
    			cambiaTesto(id_span, '');
    		}
    		return errore;
    	});
    }
    Giusto?

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.