Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    160
    Purtroppo uso js una volta ogni tre anni (solo per qualche esigenza particolare) e mi dispiace perchè non sono per nulla pratico.
    Il debug passo passo non ho idea di come si faccia, e con quali strumenti, non lo so

    Se può aiutare

    codice:
    $ cat window-resources.js 
    function open_window_resources() {
        setTimeout(() => {
            console.log('aaa')
        }, 0);
        const searchParams = new URLSearchParams(window.location.search);
    
    
        var script = document.createElement("script");
        var
            day = searchParams.has('day') ? searchParams.get('day') : new Date().getDate(),
            day2Digits = String(day).padStart(2, "0")
        ;
    
    
        script.src = "resources/" + searchParams.get("config_filename") + ".js";
        script.type = "text/javascript";
        script.async = false;
    
    
        document.head.appendChild(script);
        setTimeout(() => {
            console.log('ccc')
        }, 0);
    
    
        url_templates.forEach(
            function (template) {
                var url = template
                    .replace("%1", day)
                    .replace("%2", day2Digits)
                ;
    
    
                window.open(url);
            }
        );
    }
    
    
    $ cat resources/example.js 
    var url_templates = new Array(
        "URL1",
        "URL2",
        "URL3",
    );
    setTimeout(() => {
        console.log('bbb')
    }, 0);

    In console


    codice:
    Uncaught ReferenceError: url_templates is not defined
        at open_window_resources (window-resources.js:22:5)
        at onload (index.html?config_filename=example:5:40)
    open_window_resources @ window-resources.js:22
    onload @ index.html?config_filename=example:5
    window-resources.js:3 aaa
    window-resources.js:19 ccc
    example.js:7 bbb
    Da cui intuisco che ccc viene eseguito prima di bbb
    Perchè?

    A mio avviso, la cosa non può funzionare così, perché quando tu crei l'elemento dello script all'interno della funzione start(), la funzione termina prima che il browser passi ad eseguire ciò che c'è all'interno dello script.
    Perchè?

    Non si può spezzare una funzione *non* asincrona in due parti.

    Il tuo log di "xxx" arriva evidentemente prima dell'esecuzione dello script config.js.
    Perchè?
    Ultima modifica di astros3; 01-10-2024 a 13:40

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487
    Quote Originariamente inviata da astros3 Visualizza il messaggio
    Purtroppo uso js una volta ogni tre anni (solo per qualche esigenza particolare) e mi dispiace perchè non sono per nulla pratico.
    Se vuoi programmare in JavaScript, devi essere pratico di JavaScript, almeno un minimo.

    Quote Originariamente inviata da astros3 Visualizza il messaggio
    Il debug passo passo non ho idea di come si faccia, e con quali strumenti, non lo so
    Ma si può sempre imparare, studiando.

    Quote Originariamente inviata da astros3 Visualizza il messaggio
    In console
    codice:
    Uncaught ReferenceError: url_templates is not defined
        at open_window_resources (window-resources.js:22:5)
        at onload (index.html?config_filename=example:5:40)
    open_window_resources @ window-resources.js:22
    onload @ index.html?config_filename=example:5
    window-resources.js:3 aaa
    window-resources.js:19 ccc
    example.js:7 bbb
    Da cui intuisco che ccc viene eseguito prima di bbb
    Perchè?
    Perchè?
    Perchè?
    Ma come "perché"?
    E' come dire "ho due istruzioni, e una viene prima dell'altra... perché?".
    Perché quello è l'ordine delle cose, è il principio di funzionamento del linguaggio, la convenzione prestabilita.

    L'uso di setTimeout() non voleva essere una proposta di soluzione, ma una dimostrazione del fatto che tutto ciò che viene "rimandato", viene eseguito in seguito, a dimostrazione che lo script referenziato dall'elemento nella pagina viene eseguito sicuramente dopo quello che lo definisce, ma con l'uso del setTimeout() si "rimanda a dopo" la sua esecuzione.

    Tu hai una funzione che crea un elemento il quale referenzia lo script da eseguire: ogni contenuto di quello script verrà eseguito dopo quello attuale, perché JavaScript non è multithreading e ciò che stai caricando si mette in coda alla routine corrente.

    L'uso di setTimeout() serviva a dimostrare che, pur con un intervallo a zero, se gli fai eseguire la stampa di qualcosa definita nello script che stai caricando dalla funzione, questa stampa va a buon fine, questo perché quella stampa in console viene dopo il caricamento dello script, che viene dopo l'esecuzione della funzione che crea l'elemento dello script nella pagina.

    In sintesi, non puoi nella stessa funzione utilizzare variabili definite nello stesso script che viene eseguito da un elemento <script> caricato dinamicamente.

    OK, uso altri linguaggi ma Java Script proprio non mi si appiglia
    In altri linguaggi sarebbe uguale, a parità di scenario.
    Non è un problema del linguaggio.

    Studia l'Event Loop di JavaScript..
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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