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

    Dubbi su Angular 1 / Javascript e parametri funzioni anonime

    Sono in una vergognosa situazione in cui, ancorato a vecchi modi di programmare, sebbene mi sia messo al corrente di varie pratiche più moderne, mi trovo ad avere dubbi che ho pure vergogna a chiedere. Vi presento un caso che mi sembra illogico.

    Ho la seguente situazione, in cui c'è la funzione login che chiama la funzione start.
    Mi ritrovo una funzione start che prende 2 parametri, mentre la vedo chiamata con un parametro solo.
    Vabbè, suppongo che il secondo parametro sia opzionale, vado avanti.
    La cosa strana: nel corpo della funzione start c'è una funzione anonima che ha come parametro la variabile response.

    Non riesco a capire da dove salta fuori quella variabile response, visto che non la trovo altrove nel programma.
    Come viene inizializzata e come fa ad avere uno stato (response.status) se praticamente non esiste?... per me è illogico ma il programma funziona.

    Qualcuno disposto a spiegarmi in modo facile il ciclo di vita di quella variabile? Grazie.

    codice:
            function login(aLocation) {
                aService.login(version).then(start(aLocation), displayError(true));
            }
    
            // funzione chiamata dalla precedente
            function start(aLocation, disableWS) {
                return function (response) {        //da dove salta fuori response?
                    if (response && (response.status === 200)) {
                        //...
                        anotherService.init(aLocation, disableWS);
                    }
                };
            }
    Se qualcuno volesse scrivere risposte sulla mia ignoranza, o che leggendo wikipedia o un certo libro c'è tutto pregherei di astenersi, mi vergogno già di mio e non sono riuscito a chiarire il dubbio altrove, quindi preferirei risposte più concrete o al più link dove è spiegato questa che per me è magia nera.
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Ciao,
    response è un parametro della funzione che viene restituita dalla funzione start, potresti chiamarlo come ti pare...
    In pratica la funzione then accetta in ingresso una funzione che a sua volta restituisce una funzione (quella con il response) che verrà eseguita (quasi certamente) internamente tramite ajax e quel response verrà valorizzato dalla risposta ajax.
    In pratica non la troverai dichiarata da nessuna parte semplicemente perché è li che la "dichiari" (dichiari il nome del parametro quando dichiari la funzione stessa).

  3. #3
    Grazie, ma mi sembra ancora tutto ingarbugliato...

    Nel parametro "response" andrà a finire il valore restituito da anotherService.init(aLocation, disableWS) ?
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Premetto che non uso angular, ma si tratta pur sempre di javascript.
    Detto ciò in pratica il passaggio sarebbe questo:
    quando passi il parametro start(aLocation) in realtà stai passando la funzione restituita (quella che contiene il parametro result), questa verrà eseguita tramite ajax e verrà passato (tramite valorizzazione del response) il risultato della chiamata, a quel punto se viene soddisfatta la condizione sullo status viene chiamato init di un altro servizio (anotherService.init(aLocation, disableWS) passandoli aLocation. A questo punto il valore restituito da anotherService.init(aLocation, disableWS) secondo il codice che hai postato viene "perso" (non lo usi da nessuna parte).
    Se vuoi "lavorare" il valore restituito da anotherService.init(aLocation, disableWS) dovresti farlo li stesso (dentro la funzione con il response), magari mettendolo in una variabile o utilizzandolo da quella riga stessa.
    Tipo:
    codice:
    if (response && (response.status === 200)) {
                        //...
                        var anotherResponse = anotherService.init(aLocation, disableWS);
                        if(anotherResponse==="ok")
                              alert("altro servizio inizializzato");
                        else
                              alert("altro servizio non inizializzato");
                    }

  5. #5
    Capito il fatto di passare variabili come valori, allora semplifico la domanda come segue:

    La variabile response è la risposta della chiamata a quale delle seguenti?
    1) aService.login(version)
    2) start(aLocation)
    3) anotherService.init(...)

    mi pare che potrei escludere la 3 ma l'ho messa per completezza.
    Grazie per la pazienza
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  6. #6
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Quote Originariamente inviata da cofra347 Visualizza il messaggio
    Capito il fatto di passare variabili come valori, allora semplifico la domanda come segue:

    La variabile response � la risposta della chiamata a quale delle seguenti?
    1) aService.login(version)
    2) start(aLocation)
    3) anotherService.init(...)

    mi pare che potrei escludere la 3 ma l'ho messa per completezza.
    Grazie per la pazienza
    La risposta proviene da qualcosa chiamata dentro login (presumibilmente una chiamata ajax asincrona).
    Ti ripeto: quando tu passi al login la funzione che contiene "response" (che sarebbe il "return" della funzione start), questa poi verr� chiamata (quando pronta la risposta) e verr� passato il valore al suo parametro che nel tuo caso prende il nome di response e pu� essere utilizzato dentro la funzione stessa.
    Ho l'impressione che tu stia ragionando pi� in maniera "sincrona" (passami il termine), nel senso che parti dall'inizio e arrivi alla fine dell'esecuzione in maniera "sincrona" come potrebbe essere una pagina lato server che viene elaborata dall'inizio alla fine e poi restituita, piuttosto che asincrono dove sono gli eventi a "muovere" il programma, ma magari mi sbaglio...
    Ultima modifica di U235; 14-08-2020 a 15:28

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Questo penso ti possa essere utile

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Quote Originariamente inviata da cofra347 Visualizza il messaggio
    Mi ritrovo una funzione start che prende 2 parametri, mentre la vedo chiamata con un parametro solo.
    Vabbè, suppongo che il secondo parametro sia opzionale, vado avanti.
    Le funzioni in JavaScript hanno un numero di parametri potenzialmente sempre variabili: puoi indicarne quanti ne vuoi, indipendentemente dalla dichiarazione; se la funzione prevede parametri espliciti con un nome, i valori vengono salvati nei parametri in base alla posizione occupata in cui vengono passati, mentre se i valori sono assenti i parametri saranno undefined, oppure ancora se indichi più valori dei parametri a disposizione, essi saranno accettati comunque e saranno accessibili tramite la variabile "nascosta" (passami il termine) arguments all'interno della funzione.

    Quote Originariamente inviata da cofra347 Visualizza il messaggio
    La cosa strana: nel corpo della funzione start c'è una funzione anonima che ha come parametro la variabile response. Non riesco a capire da dove salta fuori quella variabile response, visto che non la trovo altrove nel programma.
    Come ti è stato già detto, non salta fuori da nessuna parte perché è dichiarato come parametro della funzione in cui appare, quindi quella funzione si aspetta che il valore di response venga passato nel momento in cui viene invocata.

    Sarà quindi il codice che riceve la funzione stessa come valore di ritorno ad andare a richiamare questa passando il valore corretto come parametro response.

    Oltre alle Promise che ti hanno suggerito, approfondisci anche l'argomento della programmazione funzionale.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    È giusto così?

    1. aService.login(version) -- ha una response, che supponiamo essere 200 per comodità)

    2. quindi, quando la promessa viene mantenuta, chiamiamo .then(start(...), displayerror(...))

    3. Arrivando dentro il corpo di start() vediamo una funzione anonima function (response), quel response contiene 200, cioè il valore che abbiamo ottenuto al punto 1? Cioè il risultato di aService.login?

    Da ciò dedurrei che se il login ha successo, quella funzione anonima vedrà 200 dentro la variabile response.

    (Anche se non sarà il mio forte, ho usato la programmazione funzionale ma in java, là non mi è mai capitato di non riuscire a capire da dove arriva un valore. Comunque (ri)leggerò i vari testi. Più che di concetti, mi pare che sia forse più un problema di sintassi)
    Ultima modifica di cofra347; 16-08-2020 a 12:55

  10. #10
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,538
    Non sono sicuro di poterti dire: "si, è corretto", perché ho l'impressione che ancora qualcosa ti sfugga.
    Forse vedere tutti i possibili passaggi commentati in un codice che simula il tuo ti potrebbe essere d'aiuto:

    Qui puoi vederlo in azione.

    codice:
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
    </head>
    <body>
    <select id="Version" onchange="change()">
            <option value="0">0</option>
            <option value="1">1</option>
            <option value="2">2</option>
        </select>
        <div id="log"></div>
        [inizio tag script]
            //select per scegliere la "versione"
            var myselect = document.getElementById("Version");
            //div per scrivere ciò che accade
            var log = document.getElementById("log");
            //versione
            var version = 0;
            //location (???)
            var aLocation = "ABCD";
            //oggetto per creare una simulazione del tuo codice
            var aService = {};
            //funzione per rilevare la scelta della versione ed avviare il codice
            function change() { 
                //recupero la scelta e la converto da testo a numerico
                version = parseInt(myselect.options[myselect.selectedIndex].value);
                //avvio il codice
                login(aLocation);
            }
            //funzione login che restituisce una Promise ed accetta in ingresso la versione
            aService.login = (version) => {
                //la Promise in ingresso accetta due parametri che saranno le funzioni che passi al "then", quindi quella anonima 
                //che contiene il parametro che hai nominato come "result" e una che scrive in caso non sia andata a buon fine la chiamata: ((reason) => log.innerHTML =" ERRORE: "+reason)
                return new Promise((resolve, reject) => {
                    //simulazione
                    if (version < 1) {
                        //non va a buon fine e quindi viene chiamato (reason) => log.innerHTML =" ERRORE: "+reason
                        reject("versione minima 1, ko");
                    }
                    if (version === 1) {
                        //dopo 5 secondi viene passata una stringa, questo sarà il valore che prenderà il parametro "result" della funzione anonima
                        setTimeout(()=> resolve("Consigliato upgrade, ok"),5000);
                    }
                    else if (version > 1) {
                        //dopo 2 secondi viene passata una stringa, questo sarà il valore che prenderà il parametro "result" della funzione anonima
                        setTimeout(() => resolve("ok"), 2000);
                    }
                });
            }
            //funzione di avvio
            function login(aLocation) {
                //scrivo nel div "log"
                log.innerHTML = "Login in corso, attendere";
                //chiamo il login passando la versione, e nel then passo il valore restituito di start (quindi la funzione anonima con il result)
                //più una funzione in caso di errore, il cui parametro (reason) prenderà il valore passato nel reject della Promise
                aService.login(version).then(start(aLocation), (reason) => log.innerHTML =" ERRORE: "+reason);
            }
    
    
            // funzione chiamata dalla precedente
            function start(aLocation, disableWS) {
                return function (response) {        //da dove salta fuori response?
                    log.innerHTML = response;
                };
            }
        [fine tag script]
    </body>
    </html>
    @vincent, mi blocca se posto il codice qui.
    Ultima modifica di U235; 16-08-2020 a 20:55

Tag per questa discussione

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.