Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732

    [Workaround necessario] Richiesta ajax troppo lenta per un giochino

    Sto sviluppando un giochino a tempo perso, il cui concept è semplice: dall'alto cadono delle lettere, random ed in posizioni random. Cliccando su ogni lettera si possono formare delle parole che, se di senso compiuto, vanno a formare un punteggio.
    Giochino semplice e banale, ma mi sta servendo per "giocare" un po' con jQuery ed il suo scopo è più che altro didattico, per me.

    Lo sviluppo è quasi terminato, rimane qualche piccolo bug qua e la ma è già giocabile. Il problema è che quando l'ho spostato sul server in produzione (non proprio un fulmine di guerra, anzi...) diventa praticamente ingiocabile: il tempo richiesto per il controllo di ogni parola è lunghissimo e durante l'"elaborazione" il gioco va in freeze per alcune centinaia di millisecondi, che è francamente troppo.
    Ho provato ad impostare il confronto in modo asincrono, non ho più la lentezza ma il confronto non viene praticamente più considerato, perché js prosegue nelle istruzioni ignorando l'attesa della richiesta.

    In particolare, questo è il codice javascript che richiama il confronto (fatto lato server, perché il dizionario è di più di 2mb e manda in crash i browser degli smartphone)
    codice:
        function checkWord() {
            var result = false;
            var word = $("#wordsbar").text();
            if (word.length >= 2) {
    
                var result = $.ajax({
                    url: "search.php",
                    data: { w: word },
                    async: false
                });
                result = result['responseText'];
            }
            return result;
        }
    E questo lo script php che si occupa del confronto
    Codice PHP:
    <?php
    $word 
    strtolower($_GET['w']);
    $dictionary file('words_italian.txt'FILE_IGNORE_NEW_LINES);

    if ( 
    in_array($word$dictionary) ) {
        echo 
    "1";
    }
    L'elaborazione del codice php, per inciso, richiede circa 90millisecondi. Tantini (in futuro sostituirò in_array con qualcosa di più veloce), ma per ora sono trascurabili... il problema sono i 700-800 dovuti alla richiesta ajax

    Idee su come velocizzare il tutto, o quantomeno (in realtà è più che altro questo ad interessarmi, non potendo al momento cambiare server) come "mascherare" la lentezza della richiesta?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    ti si freeza proprio perche stai facendo una chiamata sincrona, tranne per motivi particolari è sempre sconsigliato fare chiamate sincrone. Imposta la chiamata ajax in asicrono, le istruzioni da lanciare al termine del caricamento della chiamata vanno inseriti nella funzione success.

  3. #3
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    Il problema della chiamata asincrona è che il return successivo non aspetta il risultato della chiamata ajax, nemmeno se metto il tutto dentro la funzione success..

    Con la chiamata sincrona non ho questo problema, perché il browser "aspetta" la risposta prima di proseguire.

    Per intenderci, concettualmente questo è quello che vorrei fare:
    codice:
    function checkWord() {
            var word = $("#wordsbar").text();
            if (word.length >= 2) {
    
                $.ajax({
                    url: "search.php",
                    data: { w: word },
                    async: true,
                    success: function(msg) {
                        return msg;
                    }
                });
            }
    }
    Ovviamente... il return da dentro la funzione success non mi da il risultato sperato, e quindi ho bisogno di "aggirare" la cosa... ma non mi viene in mente nulla

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    una soluzione potrebbe essere questa:

    codice:
    function checkWord() {
            var word = $("#wordsbar").text();
            if (word.length >= 2) {
    
                return $.ajax({
                    url: "search.php",
                    data: { w: word },
                });
            }
    }
    
    promise = checkWord();
    promise.success(function(msg) {
                        //chiamata terminata effettuo operazioni
                    });

  5. #5
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    Figata funziona! Non avevo pensato a fare il return direttamente della funzione... grazie!

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.