Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    esegui ajax fino a quando success result = 0

    Salve a tutti,
    non riesco a venirne a capo.
    ho un file php che esegue una query e mi ritorna semplicemente un valore numerico.
    Devo eseguire questa chiamata Ajax fino a quando il valore di result è uguale a 0.
    Ho fatto questo
    codice:
    var i = 1;
           while(i > 0)
           {
               jQuery.ajax({
                url: "script_che_accede_al_database.php", 
                success: function(result) {
                    if(result == 0)
                    {
                        // esegui codice
                    }
                    else
                    {
                        // esegui codice
                    }
    
    
              }
            });	
           i = result;
           }
    Evidentemente sbaglio, visto che sto cercando di portare fuori dalla funzione il valore result.
    Come posso fare per risolvere il problema?
    Grazie.

  2. #2
    ho provato anche così, ma result mi ritorna sempre undefined.
    Però se faccio il debug da browser, nella sezione RETE, in Risposta vedo il valore di ritorno corretto:
    codice:
    function elabora()
        {
            jQuery.ajax({
                url: "script_che_accede_al_database.php", 
                success: function(result) {
                    if(result == 0)
                    {
                        // esegui codice
                    }
                    else
                    {
                        // esegui codice
                    }
    
    
              return result;
              }
            }); 
        }
    
    var i = 1;
           let conteggio = '';
           while(i > 0)
           {
               conteggio = elabora();
               alert(conteggio);
               i = conteggio;
           }

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Quote Originariamente inviata da DUMAX Visualizza il messaggio
    Salve a tutti,
    Devo eseguire questa chiamata Ajax fino a quando il valore di result è uguale a 0.
    Il linguaggio JavaScript lavora in modo asincrono per natura: non si fanno MAI cicli iterativi bloccanti su operazioni tendenzialmente di una certa durata, soprattutto quando il codice è eseguito all'interno del browser.

    Se proprio vuoi ripetere la chiamata fino al raggiungimento di una condizione, utilizza le funzioni setTimeout() oppure setInterval() per ritentare la richiesta dopo un certo periodo, ma non puoi sicuramente né ripeterla costantemente (è come fare un attacco Dos al server!), soprattutto perché la stessa chiamata AJAX è asincrona, ovvero quando esegui l'istruzione questa lavora in background e ti invoca un callback nel momento in cui ricevi la risposta: in quella sede devi analizzare il valore di ritorno, ma se lo fai prima che l'operazione sia terminata il risultato sarà ovviamente undefined (vedi questi esempi per comprendere il meccanismo).

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

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

  4. #4
    Ciao alka,
    grazie dei chiarimenti.
    Il problema è che non conosco la durata dell'esecuzione dello script php.

    Lo script php legge in una tabella mysql, fa alcuni alcuni calcoli e cancella le righe dalla tabella una ad una ad ogni ciclo.
    Questo comporta il superamento del tempo massimo consentito dal server per l'esecuzione degli script.

    Così avevo pensato di aggiungere un LIMIT alla query di lettura per ridurre i tempi di esecuzione.
    In questo modo speravo di usare Ajax per chiamare lo script fino ad esaurimento delle righe nella tabella.
    Evidentemente sbagliavo.

    Sicuramente ci sono dei metodi per mantenere attiva l'elaborazione dello script senza bloccarne l'esecuzione una volta raggiunto il limite di tempo, ma non ho ancora trovato un modo.

  5. #5
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    ma queste operazioni sono di tipo batch. non ha senso tenere la connessione attiva a livello di client.

    dal client puoi monitorare il batch se occorre.

    se usi php puoi pensare di avviare il bacth con ajax che chiama php. php esegue in modo asincrono la richiesta ma nel mentre ti da l'ok che la procedura è avviata. infine con un setInterval, puoi andare in polling per monitorare lo stato del batch
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  6. #6
    ciao ciro78,

    se riesci a postare il link di un esempio pratico dal web, te ne sarei grato ... forse riuscirei a capire meglio.
    Purtroppo non ho molta confidenza con javascript e jQuery.

    Il mio problema è il seguente:
    devo lanciare via browser uno script php che ha una durata di minuti, superiore ai limiti imposti dal server.

    Per scavalcare il problema ho pensato di elaborare i dati poco per volta aggiungendo un LIMIT 100 alla query principale nel file php.
    Per eseguire il tutto, ho pensato a jQuery e ajax.
    Per renderlo funzionante, in attesa di una soluzione migliore ho dovuto aggiungere ad ajax "async: false" ... ovviamente il browser sembra freezato durante l'esecuzione, ma così raggiungo il mio obbiettivo.

    Concettualmente adesso funziona così:
    1. ajax chiama il file php;
    2. il file php esegue il tutto e mi restituisce il valore del numero delle righe che devono essere ancora elaborate;
    3. continuo a far lanciare lo script da ajax fino a quando il valore restituito dallo script php è uguale a 0.

    Ringrazio anticipatamente qualsiasi suggerimento.

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Io vedo una gamma abbastanza limitata di soluzioni:

    1)
    crei uno script in un altro linguaggio che possa essere ingaggiato in qualche modo da PHP ma facendo in modo che la pagina PHP dia solo l'avvio alla procedura, restituendone lo stato tramite la stessa o un'altra pagina;

    2)
    suddividi il tuo batch in "gruppi" di elementi da elaborare (record o altro) usando AJAX per invocare la pagina e ottenere il risultato dell'elaborazione di quel gruppo, tendenzialmente piccolo e senza rischio di timeout; all'avvio di ogni procedura, a fronte della risposta si passa a eseguire il gruppo successivo e così via, fino a esaurimento dei gruppi di dati da elaborare (di cui puoi tenere sulla pagina lato client anche solo gli indici o i riferimenti); questo approccio consente anche di aggiornare contestualmente anche la pagina in modo dinamico, mostrando di volta in volta i gruppi che vengono elaborati, ma richiede ovviamente esperienza nella manipolazione della pagina con il DOM o con JQuery o altro framework.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.