Not logged inIl Forum di Web-link
Forum Home di Web-Link.it Help Search Register Login
  Previous Next Up Topic AJAX Programmazione / AJAX / modalità sincrona e asincrona (locked) (403 hits)
- - By lillo Date 04-05-2010 00:00 Edited 04-05-2010 00:03
Ciao maxk!
Grazie 1000 per la tua guida è l'unica che mi è riuscita a fare avvicinare ad Ajax!
Penso di avere abbastanza capito la differenza tra i due metodi, quello che non riesco a spiegarmi è il perchè con la modalità sincrona funziona tutto e con l'asincrona più niente

Ho creato diverse funzioni javascript (o meglio Ajax) che girano contemporaneamente sulla pagina tra cui una chat, e 4-5 refresh automatici che a condizione sia presente un determinato valore sul database si aggiornano automaticamente con la funzione setTimeout("",...);
Il problema è che essendo numerosi i refresh ho paura che con la modalità sincrona, questi aggiornamenti si possano accavallare l'uno sull'altro bloccando la pagina web o non venendo eseguiti. Infatti in alcune occasioni, testando la pagina sul web (in locale non ha mai dato problemi) alcuni aggiornamenti sincroni non venivano eseguiti, pur essendo il corrispondente valore del database corretto per visualizzarli.
Come tempo di aggiornamento ho impostato 1000 (1 secondo) poichè ho bisogno di un aggiornamento più che rapido non appena venga variato il valore all'interno del db MySQL.
Siccome la mia applicazione non deve assolutamente 'dimenticarsi' di visualizzare il contenuto ho pensato che fosse meglio utilizzare la modalità asincrona, in maniera tale che le richieste possano venire eseguite anche contemporaneamente una sull'altra...

Ho variato quindi il valore false (sincrono) in true (asincrono), ma dopo averlo fatto tutti gli script non funzionano più... neanche uno.
Come codice ho ovviamente preso spunto dalla tua guida, con connessioni al db MySQL e passaggio di dati con metodo POST.

Bisogna cambiare qualcosa nel codice quando si usa l'asincrona?!?
Quando si hanno tanti aggiornamenti contemporaneamente quale delle due modalità è più corretto/consigliabile usare?!?
Troppi aggiornamenti che fanno riferimento a database possono appesantire la pagina, o si possono usare tranquillamente?!? ti sentivo parlare anche di 15-20 refresh contemporaneamente.
Accedendo alla pagina da iPhone l'ho trovata un pochino lenta e scattosa anche per via dei continui aggiornamenti che sono riscontrabili con la rotellina di caricamento sulla barra superiore vicino all'orologio (non so se puoi averla presente), questo è molto fastidioso e pensavo che ajax servisse anche per rendere l'utente inconsapevole dei continui aggiornamenti che vi sono dietro, mi sbaglio?!?

Scusa se mi sono dilungato troppo,
1000 per il tuo aiuto!
Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 04-05-2010 08:57
lillo, il problema è che non sapendo come hai fatto il codice risulta difficile capire cosa c'è che non va.

La modalità asincrona ormai viene utilizzata in quasi tutte le programmazioni fatte con JS, già impostando dei timeout diversi fai eseguire a JS operazioni diverse contemporaneamente.
E' preferibile, comunque, utilizzare setInterval al posto di setTimeout quando si fanno rischieste remote o ogni qualvolta c'è da verificare una condizione.

Volevo procedere alla creazione di un corso sull'uso delle librerie jQuery che ormai, per quello che mi riguarda, hanno sostituito completamente l'uso di codice JS complesso (come è eseguire chiamate asincrone verso il DB).

Il rallentamento di sistema molte volte è causato da un uso improprio del codice. Non importa quanti refresh fai contemporaneamente, ma come questi vengono fatti; lo studio del codice, in questi casi, è molto importante proprio per evitare di incorrere in rallentamenti del sistema. Questa, infatti, è un tipo di programmazione avanzata ed evoluta e necessita di farsi esperienza sulla stesura del codice per ottenere degli ottimi risultati.

Parent - - By lillo Date 04-05-2010 15:01
Allora maxk, grazie mille della risposta, sicuramento con jQuery otterrei più semplicemente i risultati a cui aspiro, ma ormai ho impostato diverse pagine con il codice da te suggerito.
Se non ti dispiace e soprattutto se avessi voglia di darci un'occhiata ti posto il codice di un esempio di refresh che intendevo spiegarti nel post precedente.
Quello che ti mostro è quello riferito al mazziere o dealer (sto facendo una sorta di poker room con ajax e php/mysql), ovvero a quale dei due giocatori viene mostrata la pedina a seconda che il valore nel db sia 1 o 2.

Ecco lo script js che richiamo nella pagina principale
----------------- ajaxDeal.js -------------------
function dealer(whoami)
{
var URL = "dealer.php";
if(window.XMLHttpRequest)
  { httpRequest = new XMLHttpRequest(); }
else if(window.ActiveXObject)
  {
        try { httpRequest = new ActiveXObject("MSXML2.XMLHTTP.3.0"); }
        catch(e)
    {
              try { httpRequest = new ActiveXObject("MSXML2.XMLHTTP"); }
              catch(e)
      {
                  try { httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }
                  catch(e)
        { httpRequest = false; }
      }
    }
  }
else  { httpRequest = false; }

if(httpRequest)
  {
  try
    {
    httpRequest.open("POST",URL, false, null, null);
              httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    var param = "nctrl1="+ nctrl1;
              httpRequest.send(param);
    } catch (e)
      { var risultato = "Impossibile inviare la richiesta al server"; }

  switch(httpRequest.readyState)
    {
              case 1, 2, 3:
                var risultato = "Errore di comunicazione: " + httpRequest.status;
              break;
           
              case 4:
                if ( httpRequest.status != 200 )
      { var risultato = "Il server ha risposto con l'errore: " + httpRequest.status; }
    else
      {
                      deal(httpRequest.responseXML,whoami);
      setTimeout("dealer(" + "\"" + whoami + "\" )",1000);
                  }
              break;
          }
      }
else
  {
        var risultato = "Il browser non supporta connessioni XMLHttpRequest";
  }
}

function deal(xml,whoami)
{
document.getElementById('dlrp'+ whoami).innerHTML = '';
var control = xml.getElementsByTagName('ctrl');
var c01 = control[0].getElementsByTagName('c01')[0].firstChild.nodeValue;
if (c01 == whoami)
  {
  document.getElementById('dlrp'+ whoami).innerHTML = '<img src="./img/deal.png" alt="DEALER" />';
  }
else
  { }
}
----------------- ------------------ -------------------

questa invece è la pagina php che consente il passaggio dei dati:

----------------- dealer.php -------------------

<?php include("config.inc.php");
$db=mysql_connect($db_host,$db_user,$db_password) or die(mysql_error());
mysql_select_db($db_name,$db) or die(mysql_error());

$query="SELECT dealer FROM ctrl".$_POST['nctrl1']." LIMIT 1";
$result=mysql_query($query,$db);
$row=mysql_fetch_array($result);

$_xml = "<ctrl>";
$_xml .= "<c01><![CDATA[" . utf8_encode($row['dealer']) . "]]></c01>";
$_xml .= "</ctrl>";
     
header("Content-type: text/xml");
print "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
print $_xml;

mysql_close($db); ?>

------------------------------------------------

Come ultima cosa l'evento onLoad del tag body inserito nella pagina che richiama tutto:

onLoad="javascript:dealer('1');dealer('2');"

e i realativi contenitori per visualizzare la pedina DEALER

<div class="dealer1" id="dlrp1"></div>
<div class="dealer2" id="dlrp2"></div>

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Il codice come puoi notare utilizza la modalità sincrona, se dovessi cambiare il paramentro false in true il codice smette di funzionare, o almeno non visualizza più la pedina...
Sai spiegarmi il perchè??
Secondo te come metodo è adatto per raggiungere lo scopo?
Gli altri aggiornamento seguono, chi più chi meno, l'andamento di questo.
Possono girare tranquillamento tutti assieme?
Come modificarli nell'altra modalità?

Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 04-05-2010 16:54
Il codice JS che hai postato va bene se usi una richiesta sincrona, mentre se vuoi una connessione asincrona dovrai aggiugere una parte di codice che manca, ovvero quella relativa a handleReadyState (come indicato nel mio mini corso AJAX).
Questa parte di codice si preoccupa di creare un oggetto per ogni richiesta e di rimanere in attesa di una risposta da parte del server per ogni richiesta effettuata, senza verificarne l'ordine di richiesta / arrivo (modalità asincrona).

Non so fino a che punto hai letto il mio corso, però se arrivi alla Lezione VI (parte B) (su http://ilmioforum.puntino.org/maxk) trovi spiegata proprio questa parte.
Inoltre in quel corso ho inserito un file ZIP contenete la "chat" creata per spiegare il funzionamento delle varie parti di codice.

Parent - - By lillo Date 04-05-2010 19:08
Grazie maxk!
Immaginavo mancasse qualcosa, infatti a quella parte di guida non ero arrivato in quanto come principiante di Ajax avevo preferito tralasciare quegli 'oggetti avanzati'.

Ho letto tutta la parte che mi hai suggerito, ma ho notato che il secondo metodo porterebbe a stravolgere completamente tutto lo script che ho già prodotto.
Per questo motivo volevo chiederti se gentilmente potresti aiutarmi ad implementare la parte mancante direttamente sul codice che ti ho citato sopra , senza per forza andare a complicare la situazione con quei numerosi oggetti, che ancora non sono riuscito a tradurre bene.
Te ne sarei enormemente grato.
Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 04-05-2010 22:01
Il problema di fondo è che la parte relativa all'asincronismo di JS è proprio quella relativa alle due sezioni "avanzate" che devi ancora leggere.

Implementare quella parte di codice (e non è solo quella) nel tuo script significa, alla fine, riscrivere l'intero script; capirai che non è semplice iteragire con un forum per fare queste cose, senza contare il tempo che ci vuole (le cose vanno testate a mano a mano che si scrivono).

Come faccio sempre, posso aiutarti a capire e correggere eventuali errori che non capisci, ma sviluppare cose "già fatte", per me, è tempo che non posso dedicare. Gli script che faccio ogni tanto e condivido con il forum, sono script che sviluppo e uso per lavoro... non ho materialmente tempo per fare una cosa del genere solo per lo sfizio di averlo fatto.

Questo Utente è stato ringraziato 1 volte per questo post.
Parent - - By lillo Date 04-05-2010 22:39
Certo maxk, ma hai tutte le ragioni del mondo..io ti parlo da principiante, faccio questo per divertimento, pensavo fosse una cosa di poco conto per un esperto..ma assolutamente non ti chiederei di riscrivermi il codice. Purtroppo adesso non penso di potercela fare a studiare anche l'altro metodo, per motivi di lavoro non ho molto tempo anch'io.
Ma poi per quello che intendo fare è realmente necessario utilizzare l'asincronismo, non si può aggiustarsi con il vecchio metodo?
Se vuoi puoi visionare il lavoro che sto facendo per farti un'idea:
http://cglmarco.altervista.org/donkbet
Scrivendo sulla chat le seguenti istruzioni cambi i valori sul database per renderti conto dei refresh che ci sono:
'flp' (mostra le 3 carte del flop)
'trn' (mostra il turn)
'river' (mostra il river)
'dl1' (sposta il dealer sul giocatore 1)
'dl2' (sposta il dealer sul giocatore 2)
e poi altre che non sto a elencarti...
Quando hai un po' di tempo (e voglia ) testa le istruzioni e mi dici se va bene continuare con questo metodo o se sarebbe meglio cambiare e mettermi a studiare l'altro...
Grazie mille maxk, sei stato veramente gentile!!!
Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 05-05-2010 08:04
Si, stai facendo un bel lavoro... solo che è da vedere bene il codice e i refresh che vengono fatti: mi si è "inchiodato" FireFox per 2 volte di fila con CPU alle stelle e necessario riavvio del browser.

Queste cose avvengono quando ci sono operazioni che vanno in loop cominciando a sovraccaricare il sistema e la memoria. Il problema è capire dove va in loop senza avere a portata di mano il codice...

Questo Utente è stato ringraziato 1 volte per questo post.
Parent - - By lillo Date 05-05-2010 14:15 Edited 05-05-2010 14:22
Si, hai ragione, purtroppo anche io alcune volte ho dovuto riavviare il browser, ma secondo te questo problema non può essere dovuto alle chiamate sincrone che tengono in attesa e non lasciano passare altre chiamate contemporaneamente, in modo che se una si blocca si blocca tutto il sistema? Se usi firefox e sicuramente avrai firebug, con la console javascript puoi renderti conto delle pagine che vengono caricate e con quale frequenza. Come altra cosa volevo domandarti se con chiamate asincrone verrebbero comunque visualizzate sempre tutte le pagine caricate come già accade, questo potrebbe costituire una falla nel sistema poichè questa console mostra esplicitamente tutti i passaggi di dati con i file XML, quindi un programmatore senza alcuna difficoltà riuscirebbe a scoprire le carte che dovrebbero restare nascoste, comunque questo è un problema relativamente semplice da risolvere.

Quello che mi interessava sapere era se è meglio lasciare richieste SINCRONE (ho letto che spesso possono bloccare il browser se troppo frequenti) oppure passare a quelle ASINCRONE?!?

Ah dimenticavo, i codici seguono tutti lo stesso principio di quello che ti ho già postato, e non penso vi siano errori...
Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 05-05-2010 17:29
Per me il problema è anche l'eccessivo uso di richieste e di controlli... probabilmente quando fai una delle richieste aggiuntive (tramite chat) si sormonta qualcosa o impegnano troppo le risorse del browser.
Ho notato che si fa difficoltà anche a scrivere il testo nel campo TEXT della chat. C'è qualche processo di controllo?

Per XML, i dati sono sempre visibili, alla fine l'asincronicità della richiesta ti permette solo di non avere l'attesa che un altro processo volga al termine. Comunque, in questi casi, l'unica cosa che devi passare in XML sono i dati visibili e non quelli che devono restare "segreti". Deve essere PHP che gestisce "le carte nascoste" e non JS, altrimenti finisce lo scopo del gioco.

Dal mio modesto punto di vista è meglio passare alle procedure asincrone, però prima sarebbe necessario studiare e risolvere il problema delle molte richieste che partono ogni secondo. Per me, se studiato bene, puoi effettuare una sola richiesta ogni 4/5 secondi che racchiuda tutte le richieste necessarie per il gioco.

Parent - - By lillo Date 05-05-2010 22:40
La soluzione che cercavo forse era proprio quella di racchiudere tutte le richieste in un'unica, che viene richiamata ogni 4-5 secondi... In questo modo potrei ( forse ) evitare di sovraccaricare il browser...

Hai voglia di guardare ancora una volta e dirmi se per te così può andare?!?

Ah! per quel che riguarda il TEXT non ho messo sopra nessun controllo, ma era scattoso sempre per quei continui aggiornamenti, adesso scatta solo + una volta ogni 4 secondi (direi quasi impercettibile, o comunque non limita quasi per nulla la scrittura fluida).
Parent - - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 05-05-2010 23:09
Più di quello che ti ho detto non posso dire, solo per il fatto che certe cose bisogna provarle per capire se funzionano o meno.

Parent - - By lillo Date 05-05-2010 23:32
Sei un amico!

>solo per il fatto che certe cose bisogna provarle per capire se funzionano o meno


scusa avevo rinominato la cartella adesso puoi visualizzare i cambiamenti, ora non si dovrebbe più bloccare, aspetto conferma!
Parent - By maxk Super Admin area PHP AJAX JavaScript persona disponibile e competenteAvatar Maxk5.0002.0001.000 Date 06-05-2010 00:06
Mi sembra meglio di prima, però è ancora un po' "pesante" come prestazioni... sicuramente migliorabile.

  Previous Next Up Topic AJAX Programmazione / AJAX / modalità sincrona e asincrona (locked) (403 hits)

Powered by mwForum 2.22.1 © 1999-2010 Markus Wichitill

Links utili a pagine e servizi del Forum.
Forum - Vedi la mappa Mappa Geografica Utenti - Gli Admin - Faccine o Smileys - Attributi Testo - Gruppi - Tips - Regole

Primi Passi Primi Passi HTML - Guida HTML Guida HTML 4.01 - Guida CSS Guida CSS - Guida XHTML XHTML con style - Scripting - F.A.Q.