Esto parece muy trivial, pero sin embargo voy a plantear porque no puedo encontrar un ejemplo simple y claro. Tenga en cuenta que si responde con una función y no declara una clase, no lo aceptaré como solución. Entiendo que JS considera que las clases funcionan...
class MyClass{ constructor(input0){ this._input0 = input0; this._input1 = []; } set_input1(){ /** * in my case complex algebraic manipulation occurs inside this function * by putting it inside of a function it encapsulates that * in this the result is 123 ;) */ this._input1.push(123); }Ahora, para inicializar realmente el objeto como se muestra aquí. En este caso, input0 se establece en 'foo'
myobj = new MyClass('foo') myobj.set_input1() console.log(myobj._input1) //returns empty array []Hoy estaba construyendo un agregador de datos con nodejs y no pude hacerlo funcionar.
ProjDb.js
class ProjDb { constructor(_rsviewProjDirArr) { this._rsviewProjDirArr = _rsviewProjDirArr; // Full file directory paths this._allFileNameArr = []; } // end constructor set_allFileNameArr() { this._rsviewProjDirArr.forEach((i) => { fs.readdir(i, (err, files) => { if (err) { throw (err); } else { files.forEach(file => { if (path.extname(file) == ".DBF") { this._allFileNameArr.push(file); } }); } }); }); } }// end classs = ProjDb module.exports = ProjDb;SERVIDOR.js
const XLSX = require('xlsx'); const util = require('util'); const ProjDb = require('./ProjDb.js'); let projDb = new ProjDb( ['./rsview-data/proj1', './rsview-data/proj2']); projDb.set_allFileNameArr(); console.log(projDb._allFileNameArr.length); // result =0 but should be large numberMe gusta este patrón porque la depuración es muy fácil en dispositivos pequeños y sistemas complejos. Puedo resolver el problema rápidamente. También hace que el código sea fácil de leer. Lo único que se me ocurrió es que debido a que hay un alcance que envuelve al constructor, no puedo redefinir los valores dentro de él... Hago esto todo el tiempo en cpp y python. Entonces, si puedes explicarlo desde esa perspectiva, me encantaría. No veo que ninguno de estos deba fallar.
en el constructor tienes this._input1 = [];
sin embargo, la consola es console.log(myobj.input1)
funciona bien si corrige el error tipográfico del nombre:
class MyClass{ constructor(input0){ this._input0 = input0; this._input1 = []; } set_input1(){ /** * in my case complex algebraic manipulation occurs inside this function * by putting it inside of a function it encapsulates that * in this the result is 123 ;) */ this._input1.push(123); } } myobj = new MyClass('foo') myobj.set_input1() console.log(myobj._input1) // [123]Después de un poco de excavación, encontré una manera. Parece que puede actualizar la función miembro como cabría esperar. El **código en el segundo ejemplo usa la función de nodo del módulo fs fs.readdir . Después de una revisión, descubrí que los archivos son una palabra clave para la devolución de llamada y deben usarse, además, devuelve un objeto, no una matriz. Por lo tanto, ese objeto debe transformarse en una matriz de cadenas utilizando el miembro integrado toString().
aquí está la copia de trabajo
set_allFileNameArr() { // rename i as dirpath for (let i=0;i<this._rsviewProjDirArr.length;i++) { let _dirPath = this._rsviewProjDirArr[i]; var logstream = fs.createWriteStream('allFileNameArr.txt', {flas: 'a'}); console.log('Loading Data From Target Directory:\n\t'+_dirPath) // Method 1 // (err,files) are 2 arguments for a callbqack function fs.readdir(_dirPath, (err, _files)=>{ if (err) throw (err); else { // For loop style for (let i=0;i<_files.length;i++){ if(path.extname(_files[i])==='.DBF'){ this._allFileNameArr.push(_files[i].toString()); logstream.write(_files[i].toString()+'\n') } } } } );