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

    come posso rallentare un ciclo for?

    ciao ragazzi ho un problema:

    ho dovuto modificare un programma estraendo delle informazioni da esso poi le ho inviate attraverso l'oggetto xmlhttprequest ad un file php che li riceve e li scrive in un file.
    Il problema è che talvolta non vengono scritti nell'esatta maniera in cui sono stati estratti, ossia talvolta il file 5 viene prima del 4.
    Il motivo non so spiegarmelo, pensavo fosse dovuto al fatto che la scrittura avviene in tempi ravvicinati e quindi durante le varie operazioni possono accavallarsi e causare queste situazioni.
    Per questo motivo cercavo un modo per evitarlo, qualcuno può suggerirmelo?
    Penso che il problema risieda nella funzione in javascript che invia i dati perchè secondo me il ciclo avviene troppo velocemente e i dati vengono inviati quasi in simultanea quindi quando vengono processati dagli script php talvolta "si superano" perchè magari ci sono meno informazioni da scrivere.
    Almeno questa è la mia idea, tra l'altro ho notato che inserendo un alert nel ciclo, quest'ultimo funziona perfettamente.

    per completezza metto parte del codice, ho inserito la parte di php nel rispettivo forum :

    dal file .js:

    createXHR: function(inviodati) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", inviodati, true);
    xmlHttp.send(null);
    xmlHttp.close;

    }
    try {
    for (var j = 0; j < length; ++j) {


    var file = context.netProgress.files[j];
    if (panel.getCategory(file) == "category-html" || panel.getCategory(file) == "category-xhr") {
    href = panel.getHref(file);
    domain = panel.getDomain(file);
    size = panel.getSize(file);

    var date = this.now();

    timeElapsed = panel.formatTime(file.endTime - file.startTime);
    if (panel.hasResponseHeaders(file)) {
    responseHeaders = this.HeadersReturner(file.responseHeaders);
    requestHeaders = this.HeadersReturner(file.requestHeaders);

    if (panel.getCategory(file) == "category-xhr")
    xhrRootPage = this.rootPageAjaxed(file.requestHeaders);
    }
    inviodati = page +
    "?date=" +
    escape(date) +
    "&href=" +
    escape(href) +
    "&domain=" +
    escape(domain) +
    "&size=" +
    escape(size) +
    "&timeElapsed=" +
    escape(timeElapsed) +
    "&responseHeaders=" +
    escape(responseHeaders) +
    "&requestHeaders=" +
    escape(requestHeaders) +
    "&xhrRootPage=" +
    escape(xhrRootPage);


    this.createXHR(inviodati);




    }

    }

    }
    catch (e) {
    alert(e);
    }

  2. #2
    Prova con un setInterval, ma neanche questa soluzione è sicura, l'unico modo per star certi è fare le chiamate l'una dopo l'altra ( nel gestore onreadystatechange insomma ).
    Fossi in te comunque rivedrei la logica dello script: è molto meglio fare una sola chiamata ad una pagina php che richiama tutte le altre.

  3. #3
    se ti riferisci ai file php, si ho un file php che riceve i dati e poi include altri 2 file php per salvarli in un database e scrivere un file.
    come dovrei usarlo onreadystatechange?
    O meglio come faccio a creare un feedback che dalla pagina php vada allo script js e gli dica che può continuare perchè i dati sono salvati?

  4. #4
    Fermati un attimo. Prima di ipotizzare cose del genere pensa:
    perchè devo fare 5 chiamate xmlhttprequest quando ne posso fare una?
    Tu devi semplicemente chiamare una pagina php che include tutte le altre:
    codice:
    <?php
    include("pagina1.php");
    include("pagina2.php"); 
    //ecc...
    ?>
    In questo modo è molto difficile che avrai problemi.

  5. #5
    scusami ma non ho capito che intendi, forse ho spiegato male come funziona l'applicazione.
    Riepilogo cercando di far capire meglio:

    Devo estrarre delle informazioni (record con n campi) ma il numero di record è sempre variabile e mi appaiono a schermo in un certo ordine.
    Attraverso un evento attivato da un bottone i vari record vengono inviati dallo script javascript ad uno script php.
    Ora non conoscendo a priori il numero di record ho implementato questa soluzione con un ciclo for di invio di ogni singolo record attraverso una chiamata xmlhttprequest. Lo script php riceve il singolo record e lo inserisce in un database tutto questo mentre il ciclo nello script javascript continua, ritorna alla chiamata xmlxhttprequest e invia di nuovo un altro record allo script php e così via...
    In questo scenario accade che talvolta record che erano cronologicamente precedenti ad altri si trovino successivamente all'interno del database come se fossero stati "superati" da altri nel percorso di memorizzazione.
    Il motivo, ho pensato, poteva dipendere dal fatto che il ciclo for sia molto più veloce del resto del codice php, e in effetti se inserisco un ciclo for per perdere tempo, tutto funziona come dovrebbe.
    Peccato che questa soluzione mi costringe ad aspettare diversi secondi ad ogni invio e poi non è propriamente elegante.
    Detto questo, mi puoi illustrare la tua soluzione in maniera più chiara ?
    Ti ringrazio

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Dato che interessa pure me, ho fatto un piccolo esempio.
    Suppongo di avere un certo numero di TextBox dentro un contenitore, e di doverli scaricare uno a uno, in sequenza, in un database Access, utilizzando ajax.
    Quello di sotto è il risultato. Non so se possa essere utile.

    codice:
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Invio dati in sequenza.aspx.vb" Inherits="CorsoApogeo_ajax_semplice_ajax_Invio_dati_in_sequenza" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Pagina senza titolo</title>
        <link href="../../../stili/Styles.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript" src="../../../js/libreria.comp.js"></script>
        
    <script language="javascript" type="text/javascript">
    // <!CDATA[
    
    function Button1_onclick() 
    {
        var v = getElements("contenitore", "input", "text");
        var n = v.length;
        if(n == 0) return;
        var j = 0;
        
    
        function spedisci_dati()
        {
            var parameters = "nome=" + encodeURIComponent(v[j].value)
                + "&id=" + j;
            ajax("?comando_ajax=1", onload, parameters, onerror);
    
        }
    
    
        function onload()
        {
            var t = this.request.responseText;
            $("div1").innerHTML += t + "
    ";
            j++;
            if(j < n) spedisci_dati();
        }
        
        if(j < n) 
        {
            $("div1").innerHTML = ""; 
            spedisci_dati();
        };
        
    }
    
    
    
    
    // ]]>
    </script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div id="contenitore">
                <input id="Text1" type="text" value="Stefano" />
    
                <input id="Text2" type="text" value="Carlo" />
    
                <input id="Text3" type="text" value="Nicola" />
    
            </div>
            
    
            <input id="Button1" type="button" value="invia" onclick="return Button1_onclick()" />
            <div id="div1"></div>
            
            
        </form>
    </body>
    </html>
    Pietro

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.