2015-08-30 4 views
0

У меня есть модуль узла, и мне нужно проанализировать данные, и я хочу поделиться этими анализируемыми свойствами в разных модулях. Первый модуль, который вызывает это, несет ответственность за передачу данных и других модулей не нужно отправлять данные, так как я уже храню parsedData (в cacheObj), и может использовать только получить какое-либо свойство, проблема в том, когда я получаю доступ с 1 модуля и предоставляю данные, а затем пытаюсь получить доступ из diff-модуля, объект кеша не содержит данные, которые я «храню», любая идея, как это сделать правильно?Доступ к данным модуля из модуля diff

"use strict"; 
var Parser = require('myParser'), 
    _ = require('lodash'); 

function myParser(data) { 
    if (!(this instanceof myParser)) return new myParser(data); 
    if (!_.isEmpty(this.cacheObj)) { 
     this.parsedData = this.cacheObj; 
    } else { 
     this.parsedData = Parser.parse(data); 
     this.cacheObj = this.parsedData; 
    } 
} 

myParser.prototype = { 
    cacheObj: {}, 
    getPropOne: function() { 
     return this.parsedData.propOne; 
    }, 

    getPropTwo: function() { 
     return this.parsedData.propTwo; 
    } 
}; 

module.exports = myParser; 

Данные должны быть одинаковыми для моего приложения узла, поэтому я не нужно передать его каждый раз ... только для «INIT» ...

ответ

1

Использование одноэлементные объектов, основной образец ниже

var Singleton = (function() { 
    var instance; 

    function createInstance() { 
     var object = new Object("I am the instance"); 
     return object; 
    } 

    return { 
     getInstance: function() { 
      if (!instance) { 
       instance = createInstance(); 
      } 
      return instance; 
     } 
    }; 
})(); 

В вашем случае использовать тот же подход

"use strict"; 
var Parser = require('myParser'), 
    _ = require('lodash'); 

var cacheObj; // <-- singleton, will hold value and will not be reinitialized on myParser function call 

function myParser(data) { 
    if (!(this instanceof myParser)) return new myParser(data); 
    if (!_.isEmpty(cacheObj)) { //remove `this` 
     this.parsedData = cacheObj; //remove `this` 
    } else { 
     this.parsedData = Parser.parse(data); 
     cacheObj = this.parsedData; //remove `this` 
    } 
} 

myParser.prototype = { 
    //remove `this.cacheObj` 
    getPropOne: function() { 
     return this.parsedData.propOne; 
    }, 

    getPropTwo: function() { 
     return this.parsedData.propTwo; 
    } 
}; 

module.exports = myParser; 

Использование memory-cache, не забудьте установить

"use strict"; 
var Parser = require('myParser'), 
    _ = require('lodash'); 
var cache = require('memory-cache'); 

function myParser(data) { 
    if (!(this instanceof myParser)) return new myParser(data); 
    var cache_data = cache.get('foo'); 
    if (!_.isEmpty(cache_data)) { 
     this.parsedData = JSON.parse(cache_data); 
    } else { 
     this.parsedData = Parser.parse(data); 
     cache.put('foo', JSON.stringify(this.parsedData)); 
    } 
} 

myParser.prototype = { 
    getPropOne: function() { 
     return this.parsedData.propOne; 
    }, 

    getPropTwo: function() { 
     return this.parsedData.propTwo; 
    } 
}; 

module.exports = myParser; 
+0

Правильно, но я хочу, чтобы избежать использования глобальных varible (ваш второй, например), есть способ сделать это? Это не хороший дизайн, чтобы использовать его .. –

+0

Это не глобальная переменная, она существует только в этом файле –

+0

да, но это глобальный AFAIK, вы думаете, что он лучше подходит для этого? –

Смежные вопросы