Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Json Sincrono

  1. #1

    Json Sincrono

    Salve, sto utilizzando con molta soddisfazione le classi JSON per richieste cross-domain in JS e per dare ordine alla moltitudine di dati che prima gestivo con comma separated

    Il mio problema è che al momento vorrei trasformare la chiamata ajax effettuata dal JSON mediante JSONscriptRequest in una sincrona, permettendo dunque allo script di attendere sino alla risposta per poter stampare le informazioni ricevute.

    E' possibile?
    http://embracesblog.mine.nu
    http://wiki.ubuntu-it.org/AndreaOlivato

  2. #2
    dipende, dovresti intanto dirci quale libreria stai utilizzando, ce ne saranno almeno 20 che implementano JSON e Request.

    Stando alla white paper di Crockford però una corretta implementazione dell'oggeto JSONRequest deve avere per foza di cose un delay tra una request e l'altra.

    Non è specificato, almeno mi sembra, se la request debba essere per forza di cose asincrona, ma non mi risulta ci sia niente per evitarlo (url, send, done, timeout ... fine dei parametri )

    Detto questo, dato che farsi una JSONRequest non è affatto complicato e modificare il source per permettere l'operazione sincrona lo è anche di meno, sei proprio sicuro di voler piantare il browser dell'utente finchè il server non ha inviato tutti i dati ?

    Ajax, se usato sincrono e perdendo quindi la A, impedisce all'utente di interagire con la pagina, ergo se per qualche motivo hai il server lento o i dati sono numerosi e l'utente ha una connessione lenta, l'impressione che quest'ultimo avrà è di una pagina "piantata" ... il che non è proprio una bella impressione
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Questa è la classe che utilizzo

    codice:
    // jsr_class.js
    
    //
    
    // JSONscriptRequest -- a simple class for making HTTP requests
    
    // using dynamically generated script tags and JSON
    
    //
    
    // Author: Jason Levitt
    
    // Date: December 7th, 2005
    
    //
    
    // A SECURITY WARNING FROM DOUGLAS CROCKFORD:
    
    // "The dynamic <script> tag hack suffers from a problem. It allows a page 
    
    // to access data from any server in the web, which is really useful. 
    
    // Unfortunately, the data is returned in the form of a script. That script 
    
    // can deliver the data, but it runs with the same authority as scripts on 
    
    // the base page, so it is able to steal cookies or misuse the authorization 
    
    // of the user with the server. A rogue script can do destructive things to 
    
    // the relationship between the user and the base server."
    
    //
    
    // So, be extremely cautious in your use of this script.
    
    //
    
    //
    
    // Sample Usage:
    
    //
    
    // <script type="text/javascript" src="jsr_class.js"></script>
    
    // 
    
    // function callbackfunc(jsonData) {
    
    //      alert('Latitude = ' + jsonData.ResultSet.Result[0].Latitude + 
    
    //            '  Longitude = ' + jsonData.ResultSet.Result[0].Longitude);
    
    //      aObj.removeScriptTag();
    
    // }
    
    //
    
    // request = 'http://api.local.yahoo.com/MapsService/V1/geocode?appid=YahooDemo&
    
    //            output=json&callback=callbackfunc&location=78704';
    
    // aObj = new JSONscriptRequest(request);
    
    // aObj.buildScriptTag();
    
    // aObj.addScriptTag();
    
    //
    
    //
    
    
    
    
    
    // Constructor -- pass a REST request URL to the constructor
    
    //
    
    function JSONscriptRequest(fullUrl) {
    
        // REST request path
    
        this.fullUrl = fullUrl; 
    
        // Keep IE from caching requests
    
        this.noCacheIE = "#";
    
        // Get the DOM location to put the script tag
    
        this.headLoc = document.getElementsByTagName("head").item(0);
    
        // Generate a unique script tag id
    
        this.scriptId = 'JscriptId' + JSONscriptRequest.scriptCounter++;
    
    }
    
    
    
    // Static script ID counter
    
    JSONscriptRequest.scriptCounter = 1;
    
    
    
    // buildScriptTag method
    
    //
    
    JSONscriptRequest.prototype.buildScriptTag = function () {
    
    
    
        // Create the script tag
    
        this.scriptObj = document.createElement("script");
    
        
    
        // Add script object attributes
    
        this.scriptObj.setAttribute("type", "text/javascript");
    
        this.scriptObj.setAttribute("charset", "utf-8");
    
        this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
    
        this.scriptObj.setAttribute("id", this.scriptId);
    
    }
    
     
    
    // removeScriptTag method
    
    // 
    
    JSONscriptRequest.prototype.removeScriptTag = function () {
    
        // Destroy the script tag
    
        this.headLoc.removeChild(this.scriptObj);  
    
    }
    
    
    
    // addScriptTag method
    
    //
    
    JSONscriptRequest.prototype.addScriptTag = function () {
    
        // Create the script tag
    
        this.headLoc.appendChild(this.scriptObj);
    
    }
    Per quanto riguarda il sincrono ne ho necessità poichè i dati richiesti, chiamati mediante diverse richieste, devono essere combinati in funzioni matematiche che dopo l'elaborazione devono essere stampate...

    Ovviamente se lascio la richiesta asincrona i dati che mi arrivano arrivano dopo la lettura del JS... indi mi salta i calcoli, la combinazione e la stampa.
    http://embracesblog.mine.nu
    http://wiki.ubuntu-it.org/AndreaOlivato

  4. #4
    uhm ... questo script non usa Ajax, è un vecchio metodo di fare remoting (2005 ...) e non ha nemmeno una gestione eventi ad onload dello script, insomma, io non lo userei.

    Ti serve Ajax e un oggetto JSONRequest oppure ajax sincrono ... ma il motivo per cui i dati ti servono sincroni è a mio avviso discutibile, puoi spezzare le operazioni a seconda dei dati che carichi tramite eventi appunto onload, onreadustatechange o gestione dedicata.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Il problema è che se utilizzo Ajax (quindi l'evento XMLHttpReques) NON è possibile fare cross-domain, mentre io ho bisogno di questa feature...
    http://embracesblog.mine.nu
    http://wiki.ubuntu-it.org/AndreaOlivato

  6. #6
    Forse se spiego meglio ciò che devo fare potreste consigliarmi un metodo alternativo per farlo.

    I miei clienti inseriscono nelle loro pagine un codice JS che ha src nel mio dominio e solo su di esso io posso agire, non avendo accesso di alcun tipo ai loro server.

    Il mio compito è quello di prendere dati dal DB sul mio dominio e mostrarli all'interno delle loro pagine. Fino ad oggi ho utilizzato un php nel mio dominio per includere il loro sito (letto e riscritto) ed aggiungerci i dati dal mio DB.

    Ho deciso di cambiare metodo per vari motivi e vorrei utilizzare un JS per fare tutto quello che faceva il php tranne le richieste al DB ovviamente. Per questo motivo ho bisogno del cross-domain.

    Per quanto riguarda il sincronismo posso farne a meno ma ho bisogno di utilizzare funzioni di richiamo quali quella da me riportata dato che le chiamate Ajax in cross domain sono bloccate.

    Le alternative dunque quali potrebbero essere?
    http://embracesblog.mine.nu
    http://wiki.ubuntu-it.org/AndreaOlivato

  7. #7
    AdSense docet, usa in frame (document.write('<iframe src="tuodominio/pagina"></iframe>'))
    e magari ci metti lo stile personalizzabile ... insomma, proprio come AdSense ... dove il tuo utente metterà quello script si creerà lo spazio
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Non è fattibile nel mio caso poichè a quel punto non posso scrivere dati in qualsiasi punto della pagina, ma solo all'interno dell' iframe. Se si prova a utilizzare js che esca dall iframeviene bloccato.
    http://embracesblog.mine.nu
    http://wiki.ubuntu-it.org/AndreaOlivato

  9. #9
    Onestamente non ho capito se i dati da prelevare sono sempre gli stessi o se c'è una qualche successiva interazione per determinare quali dati servono. Nel primo caso puoi benissimo creare un file php dove generi dinamicamente del codice javascript attraverso una chiamata al database.
    Poi basta che gli utenti che usano il tuo servizio includino tale script .php come farebbero con un file .js:
    codice:
    <script src="http://www.tuosito.com/script.php" type="text/javascript"></script>
    Se la ragione per cui hai dovuto cambiare metodo è che non hai più a disposizione un linguaggio server side mi sa che sei fregato...

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.