2016-05-04 9 views
0

Ich habe eine Klasse namens TileStreamer, die ich zur Zeit als ich die Definition folgt:Wie richtig in Node.js Klasse strukturieren

function TileStreamer { 

}; 

Diese Klasse hat Konstanten, die ich wie folgt definieren:

// Tiles are 256 x 256 pixels 
TileStreamer.prototype.TILE_SIZE = 256; 

// Header size in bytes 
TileStreamer.prototype.HEADER_SIZE = 28; 

// Various table entry sizes in bytes 
TileStreamer.prototype.RESOLUTION_ENTRY_SIZE = 12; 
TileStreamer.prototype.TILE_COUNT_SIZE = 4; 
TileStreamer.prototype.TILE_ENTRY_SIZE = 12; 

// Offsets within header 
TileStreamer.prototype.WIDTH_OFFSET = 3; 
TileStreamer.prototype.HEIGHT_OFFSET = 4; 
TileStreamer.prototype.NUM_TABLES_OFFSET = 7; 
TileStreamer.prototype.UNPOPULATED_OFFSET = 12092; 

Dort auch andere Variablen. Diese Variablen sind wichtig, da von anderen Klassen aus zugänglich sein müssen. Sie erhalten ihre Werte innerhalb der Methoden dieser Klasse. Dies ist, was ich hinsichtlich der Struktur unsicher bin. Was ich zur Zeit bin versucht:

TileStreamer.prototype.header; 
TileStreamer.prototype.resolutionEntry; 
TileStreamer.prototype.resolutionTable; 
TileStreamer.prototype.filepath; 
TileStreamer.prototype.s3; 
TileStreamer.prototype.level; 
TileStreamer.prototype.ncols; 
TileStreamer.prototype.nrows; 
TileStreamer.prototype.nlevels; 
TileStreamer.prototype.toffset; 
TileStreamer.prototype.tsize; 
TileStreamer.prototype.modifiedTime; 
TileStreamer.prototype.tile; 
TileStreamer.prototype.host; 
TileStreamer.prototype.bucket; 

Diese Klasse hat auch Methoden wie:

TileStreamer.prototype.Init = function(filepath, index, s3config){ 
    var retval = false; 
    AWS.config.update({accessKeyId: s3config.access_key, secretAccessKey: s3config.secret_key}); 
    var blc = new BlockLibraryConfigs(); 
    var awsConfig = blc.awsConfig; 
    AWS.config.update({region: awsConfig.region}); 

    var aws = new AWS.S3(); 
    var params = { 
     Bucket: s3config.bucket, 
     Key: s3config.tile_directory + filepath, 
     Range: 'bytes=0-' + (this.HEADER_SIZE - 1) 
    }; 

    aws.getObject(params, function(err, data){ 
     if(err == null){ 
      TileStreamer.modifiedTime = data.LastModified; 
      var header = bufferpack.unpack('<7I', data.Body); 
      TileStreamer.header = header; 
      TileStreamer.nlevels = header[TileStreamer.NUM_TABLES_OFFSET]; 

      if(TileStreamer.nlevels == 5){ 
       TileStreamer.level = 0; 
       TileStreamer.ncols = Math.ceil((header[TileStreamer.WIDTH_OFFSET] * 1.0)/TileStreamer.TILE_SIZE); 
       TileStreamer.nrows = Math.ceil((header[TileStreamer.HEIGHT_OFFSET] * 1.0)/TileStreamer.TILE_SIZE); 

      } 
     } 

    });  

}; 

Die oben beschriebene Methode sollte einige der Werte der Variablen, wie modifiedTime so eingestellt, dass ich kann, Zugriff auf sie in einer anderen Klasse wie:

TileStreamer = require('tilestreamer.js'); 
var ts = new TileStreamer(); 
ts.Init(parPath, index, config); 
var last_modified = ts.modifiedTime; 
+2

Der einfachste Weg ist Eigenschaften in der init-Funktion mit dem 'this' Präfix zu erklären. .. https://jsfiddle.net/v6muhoyk/ – Archer

+0

Ich wollte nur das gleiche sagen. Verwende 'this' oder TileStreamer.prototype.modifiedTime = ...; – jjhavokk

+0

@jjhavokk Also, wenn ich Variablen in einer asynchronen Funktion, wie ich in meinem Code, setzen würde, würde mit 'TileStreamer.prototype.modifiedTime = data.LastModified' gesetzt' modifiedTime' für die gleiche Instanz? –

Antwort

3

einfach keine öffentlichen Eigenschaften, die Sie initialisieren wollen, wenn das Objekt erstellt wird, befindet sich direkt in der init-Funktion. Hier ist ein kleines Beispiel ...

function TileStreamer() { 
}; 

TileStreamer.prototype.Init = function() { 
    this.modifiedTime = new Date(); 
}; 

var ts = new TileStreamer(); 
ts.Init(); 
console.log(ts); 

jsfiddle Beispiel

https://jsfiddle.net/v6muohyk/

Um um das Problem, das Sie mit der Einstellung der Objekteigenschaften in einem Rückruf von einer asynchronen Funktion haben sollte, nur Erstellen Sie eine lokal zugängliche Variable, um auf das Objekt, das Sie gerade erstellen, zu verweisen ...

TileStreamer.prototype.Init = function() { 
    var thisTileStreamer = this; 
    asynchFunction(function(err, data) { 
     thisTileStreamer.modifiedTime = data.lastModified; 
    }); 
}; 

Um noch einen Schritt weiter zu gehen, wenn Sie Code ausführen müssen, nachdem die init-Funktion abgeschlossen ist, dann müssen Sie darauf warten, dass die asynchrone Funktion ebenfalls abgeschlossen wird. Dafür einen weiteren Parameter zu init passieren, ist, dass eine Funktion ausgeführt werden, nachdem alle Arbeit getan ist ...

TileStreamer.prototype.Init = function(callback) { 
    var thisTileStreamer = this; 
    asynchFunction(function(err, data) { 
     thisTileStreamer.modifiedTime = data.lastModified; 
     callback(); 
    }); 
}; 

var ts = new TileStreamer(); 
ts.Init(function() { 
    // put code here that needs to be executed *after* the init function has completed 
    alert(ts.modifiedTime); 
}); 
+0

In meinem Code werden Dinge wie die 'modifizierte Zeit' in einer asynchronen Funktion gesetzt, also wie würde ich diese einstellen? –

+0

Ich habe ein extra Bit hinzugefügt, um das zu bedecken. Das Problem, mit dem Sie konfrontiert wurden, war, dass Sie ein Objekt erstellt und dann versucht haben, Werte für Eigenschaften der Klasse festzulegen. Es war also kein Verweis auf das Objekt, das erstellt wurde. – Archer

+0

Okay, probieren Sie es aus. Also sollte ich Zugriff auf die Variable 'thisTileStreamer' innerhalb der asynchronen Funktion haben, ohne sie als Parameter zu übergeben? –

Verwandte Themen