Sentinell

Monitoraggio di variabili

by leonardo_ciaccio

JavaScript

/*

    IDEA :
    
        Monitorare il cambiamento di una variabile, per fare questo
        dobbiamo utilizzare un oggetto che ci fornisce la possibilità
        di utilizare una variabile di qualsiasi tipo purché non sia una
        funzione ( JSON compatibile ) .
        
        In sintesi ogni volta che cambia l'oggetto questo esegue una
        operazione.
        L'esempio utilizza un timeout per simulare un ritardo, questo non
        è necessario al fine dell'idea.
        
    PRO :
    
        Controllare lo stato di una variabile a volte risulta
        indispensabile per il controllo del codice.
        
    CONTRO :
    
        Come questo esempio occorrono almeno 50 millisecondi per il
        trigger dell'evento dal cambiamento della variabile.

*/

    // Oggetto da tenere sotto controllo
var _ = {

        mex : ""

    },
    
    // Copia shadow per il confronto
    eye,
    
    // Funzione per clonare un oggetto
    clone = function( obj ){

            if( !obj || typeof obj != "object" )return {};
    
            var news = {};
    
            for( var key in obj ) {
    
                news[ key ] = obj[ key ];
    
            }
    
            return news;
    
    },
    
    // Evento per ogni cambiamento
    observe = function( callback ){

    
        callback = callback || function(){};
        
        eye = clone( _ );
        
        setInterval( function(){
        
            if( JSON.stringify( _ ) !== JSON.stringify( eye ) ){
                
                callback( eye, _ );
                eye = clone( _ );
                           
            
            }
        
        } );
    
    };

// Attivo la sentinella
observe( function( old, last ){
    
    // old  = l'oggetto prima del cambiamento
    // last = l'oggetto aggiornato
    
    console.log( last.mex );
    
} );

// Setto un nuovo valore
_.mex = "Ciao !";

// Per simulare un vento in ritardo
setTimeout( function(){

    _.mex = "Tutto ok...