Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Passaggio di valore tra funzioni

    Buongiorno a tutti.
    Devo utilizzare una variabile presente in una funzione, dentro una seconda funzione per una somma.
    codice:
    var somma1;
    var somma2;
    			if(tp==1){
    				//somma in tempo reale
    				$.post("totale.php", { v1: $('#impReddA').val(), v2: $('#impAltriReddA').val()},
    				function(somma1) {
    					$('#impReddComplA').val(somma1);
    					$("#impTotaleReddComplA").val(somma1);
    				});
    			}
    			if(tp==2){
    				$.post("totale.php", { v4: $('#impConA').val(), v5: $('#impConAltriReddA').val()},
    				function(somma2) {
    					$('#impConReddComplA').val(somma2);
    					$("#impTotaleReddComplA").val(somma1+somma2);
    				});
    			}
    La variabile somma1, vorrei fosse vista anche dentro la seconda funzione dove c'è somma2.
    Ma, al momento la restituisce come undefined.

    Mi aiutate per favore?
    Grazie mille.

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,794
    Ciao, partiamo dal fatto che quelle due funzioni sono ciascuna un callback del metodo $.post (sostanzialmente una chiamata AJAX), il quale esegue appunto la propria funzione in modo asincrono. Il primo argomento di quei callback è un PlainObject elaborato in base a ciò che il server restituisce.

    Fai attenzione ai nomi che stai usando per definire le variabili somma1 e somma2 fuori dalle funzioni e quelli usati per definire l'argomento di ciascuna delle due funzioni. Definendo un argomento di una funzione viene automaticamente creata una variabile locale, quindi visibile solo dentro quella tale funzione. Le variabili locali ovviamente vanno a sovrascrivere (o meglio ad "oscurare", per il principio detto "scope shadowing") il valore di quelle esterne (o globali) con lo stesso nome.

    Questo significa che la variabile esterna "somma1" non viene mai valorizzata, perché dentro la funzione tu stai definendo una seconda variabile "somma1" come argomento della funzione stessa; anche se hanno lo stesso nome si tratta di due variabili (cioè due namespace) differenti, perché definite in due ambiti diversi.

    Inoltre non mi è chiaro in che modo sia eseguita ciascuna delle due funzioni, perché di fatto le due chiamate stanno dentro due diverse condizioni. Questo significa che ciascuna delle due funzioni viene richiamata in tempi e circostanze differenti.

    Ora, se si ha la certezza che la seconda funzione è richiamata dopo la prima, puoi risolvere usando dei nomi differenti tra le variabili esterne e quelle locali, quindi passare, la dove ti serve, i valori restituiti dalle funzioni alle variabili esterne (in particolare per somma1):

    codice:
    var somma1;
    
                if(tp==1){
                    //somma in tempo reale
                    $.post("totale.php", { v1: $('#impReddA').val(), v2: $('#impAltriReddA').val()},
                    function(rispostaServer) { // rispostaServer è la variabile locale dove viene passata la risposta del server
                        somma1 = rispostaServer; // passo il valore alla variabile esterna
                        $('#impReddComplA').val(somma1);
                        $("#impTotaleReddComplA").val(somma1);
                    });
                }
                if(tp==2){
                    $.post("totale.php", { v4: $('#impConA').val(), v5: $('#impConAltriReddA').val()},
                    function(rispostaServer) { // rispostaServer anche qui è una variabile locale visibile solo dentro questa funzione
                        $('#impConReddComplA').val(rispostaServer);
                        $("#impTotaleReddComplA").val(+rispostaServer+somma1); // il + iniziale serve per convertire rispostaServer in numero prima di eseguire la somma aritmetica, altrimenti si avrebbe una concatenazione di stringhe
                    });
                }
    .
    In alternativa puoi recuperare quel valore che già hai passato al val() di #impReddComplA, senza bisogno quindi di usare ulteriori variabili esterne:
    codice:
                if(tp==1){
                    //somma in tempo reale
                    $.post("totale.php", { v1: $('#impReddA').val(), v2: $('#impAltriReddA').val()},
                    function(rispostaServer) {
                        $('#impReddComplA').val(rispostaServer);
                        $("#impTotaleReddComplA").val(rispostaServer);
                    });
                }
                if(tp==2){
                    $.post("totale.php", { v4: $('#impConA').val(), v5: $('#impConAltriReddA').val()},
                    function(rispostaServer) {
                        $('#impConReddComplA').val(rispostaServer);
                        var somma1 = +$('#impReddComplA').val(); // recupero il valore della precedente somma
                        $("#impTotaleReddComplA").val(+rispostaServer+somma1);
                    });
                }
    .

    Fai sapere se può andare e se sono riuscito a chiarirti qualche dubbio.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 20% tra i post del forum; il 15% sul web.
    Ti resta... humm spè

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  3. #3
    Intanto ti ringrazio per il tuo interesse ed aiuto.
    Ho capito cosa intendi, con la sovrascrittura della variabile.
    Come faccio un test ti faccio sapere.
    Intanto grazie ancora.

  4. #4
    grazie il secondo metodo, funziona meglio del prima.
    Ma, la mia situazione è su 3 controlli, ed il terzo non mi funziona:
    codice:
    var somma1;
    			if(tp==1){
    				//somma in tempo reale
    				$.post("totale.php", { v1: $('#impReddA').val(), v2: $('#impAltriReddA').val()},
    				function(rispostaServer) {
    					//somma1 = rispostaServer;
    					$('#impReddComplA').val(rispostaServer);
    					$("#impTotaleReddComplA").val(rispostaServer);
    				});
    			}
    			if(tp==2){
    				$.post("totale.php", { v4: $('#impConA').val(), v5: $('#impConAltriReddA').val()},
    				function(rispostaServer) {
    					$('#impConReddComplA').val(rispostaServer);
                        var somma1 = +$('#impReddComplA').val(); // recupero il valore della precedente somma
                        $("#impTotaleReddComplA").val(+rispostaServer+somma1);
    				});
    			}
    			if(tp==3){
    				$.post("totale.php", { v7: $('#impFamilA').val(), v8: $('#impFamAltriReddA').val()},
    				function(rispostaServer) {
    					//var somma2 = +$('#impConReddComplA').val();
    					$('#impFamReddComplA').val(rispostaServer);
    				});
    			}
    Come vedi ho adottato il tuo suggerimento.
    Ma, per l'ultimo controllo, non so come fare.Ovviamente ho provato la tua soluzione, ma non mi aggiunge nulla al totale #impFamReddComplA.

  5. #5
    In pratica.
    Nell'ultima if, dovrebbe aggiungere sia somma1 che somma 2, ma non mi aggiunge nulla

    codice:
    if(tp==3){
    	$.post("totale.php", { v7: $('#impFamilA').val(), v8: $('#impFamAltriReddA').val()},
    				function(rispostaServer) {
    					$('#impFamReddComplA').val(rispostaServer);
    					var somma1 = +$('#impReddComplA').val();
    					var somma2 = +$('#impFamReddComplA').val();
    					$("#impTotaleReddComplA").val(+rispostaServer+somma1+somma2);
    				});
    			}

  6. #6
    Quote Originariamente inviata da ANTAGONIA Visualizza il messaggio
    In pratica.
    Nell'ultima if, dovrebbe aggiungere sia somma1 che somma 2, ma non mi aggiunge nulla

    codice:
    if(tp==3){
        $.post("totale.php", { v7: $('#impFamilA').val(), v8: $('#impFamAltriReddA').val()},
                    function(rispostaServer) {
                        $('#impFamReddComplA').val(rispostaServer);
                        var somma1 = +$('#impReddComplA').val();
                        var somma2 = +$('#impFamReddComplA').val();
                        $("#impTotaleReddComplA").val(+rispostaServer+somma1+somma2);
                    });
                }
    Adesso funziona:
    codice:
    //ho cambiato questo
    //var somma2 = +$('#impFamReddComplA').val();
    
    //con questo
    var somma2 = +$('#impConReddComplA').val();
    per il momento ti ringrazio davvero tanto.

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,794
    Ciao
    Ma, la mia situazione è su 3 controlli, ed il terzo non mi funziona
    In pratica.
    Nell'ultima if, dovrebbe aggiungere sia somma1 che somma 2, ma non mi aggiunge nulla
    Ricontrolla meglio la logica del tuo codice. Da ciò che hai scritto non mi è chiaro come debba funzionare.
    In particolare questa parte:
    codice:
                    function(rispostaServer) {
                        $('#impFamReddComplA').val(rispostaServer);
                        var somma1 = +$('#impReddComplA').val();
                        var somma2 = +$('#impFamReddComplA').val();
                        $("#impTotaleReddComplA").val(+rispostaServer+somma1+somma2);
                    });
    Nella riga 1 dentro la funzione passi il valore rispostaServer su impFamReddComplA
    poi nella riga 3 definisci somma2 a cui assegni lo stesso valore di impFamReddComplA (che sostanzialmente è il valore di rispostaServer passatogli nella riga 1)
    quindi nella riga 4 vai a a fare la somma dei 3 valori ma, a parte somma1 che a questo punto non so che valore debba avere, gli altri due (rispostaServer e somma2) hanno un valore uguale.

    Sei sicuro che debba funzionare così???

    EDIT: ho visto ora

    Adesso funziona:
    codice:
    //ho cambiato questo
    //var somma2 = +$('#impFamReddComplA').val();
    
    //con questo
    var somma2 = +$('#impConReddComplA').val();
    Cioè hai decommentato la riga che avevi commentato prima.

    Bene, mi fa piacere che funzioni. Buon proseguimento
    Ultima modifica di KillerWorm; 10-07-2020 a 09:19
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 20% tra i post del forum; il 15% sul web.
    Ti resta... humm spè

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  8. #8
    Si, perdonami, ho fatto un errore io di trascrizione.
    Comunque funziona tutto, grazie ai tuoi suggerimenti.
    Però una cosa, non mi torna.
    Perché mi restituisce questo risultato: 10,00 + 10,01 = 20.009999999999998
    Grazie.

  9. #9
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,794
    Purtroppo si tratta di un errore intrinseco dovuto al metodo di calcolo di tutti i sistemi binari che non riescono ad avere una precisione ottimale nella parte decimale. È comunque un tipo di errore conosciuto e risolvibile usando qualche stratagemma. Fai qualche ricerca, uno dei metodi usati è quello di usare .toFixed(n)
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 20% tra i post del forum; il 15% sul web.
    Ti resta... humm spè

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  10. #10
    provo e ti faccio sapere. Grazie per tutto l'aiuto.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.