我有以下代码,它是解析对象,并且像下面一样提供getters,这是有效的,问题是我想从不同的模块访问这个对象并避免再次解析,怎么能我这样做没有定义全局var?
var ymlParser = require('yamljs');
function ymlParse(src) {
if (!(this instanceof ymlParse)) return new ymlParse(src);
this.data = ymlParser.parse(src);
}
ymlParse.prototype = {
getA: function () {
return this.data.default_A;
},
getB: function () {
return this.data._B;
}
};
module.exports = ymlParse;
假设我想从模块B访问模块A和B中的A,当我调用getB时,如何在不调用getB的情况下再次发送 src ,这样我就可以这样做了通过src ...
答案 0 :(得分:0)
您可以在ymlParse
课程中进行缓存(它的设计类似于课程,不是吗?)。
只需存储src
个对象和解析结果。如果ymlParse
将使用缓存的src
执行,则只返回存储的结果而不进行解析。
尝试更改您的代码:
var ymlParser = require('yamljs');
function ymlParse(src) {
if (!(this instanceof ymlParse)) return new ymlParse(src);
if (this.cache[src]) {
this.data = this.cache[src];
} else {
this.data = ymlParser.parse(src);
this.cache[src] = this.data;
}
}
ymlParse.prototype = {
cache: {},
getA: function () {
return this.data.default_A;
},
getB: function () {
return this.data._B;
}
};
module.exports = ymlParse;
请注意,我没有使用this.data
对象的深层副本。如果它不是只读的,可能会导致一些问题。
答案 1 :(得分:0)
您可以使用Memoization模式 - http://addyosmani.com/blog/faster-javascript-memoization/。在其他答案中实施的一个问题不是散布这些论点。所以你应该有这样的东西:
var ymlParser = require('yamljs');
function ymlParse(src) {
var hash = JSON.stringify(src);
if (!(this instanceof ymlParse)) return new ymlParse(src);
if (this.cache[hash]) {
this.data = this.cache[hash];
} else {
this.data = ymlParser.parse(src);
this.cache[hash] = this.data;
}
}
ymlParse.prototype = {
cache: {},
getA: function () {
return this.data.default_A;
},
getB: function () {
return this.data._B;
}
};
module.exports = ymlParse;
仔细研究JSON.stringify方法。您必须在此处实现散列算法,该算法将与src数据关联作为唯一标识符。通常是JSON.stringify,但你可以使用自己的。
或功能风格的另一种解决方案:
var _ = require('lodash');
var ymlParser = require('yamljs');
function ymlParse(src) {
var result = ymlParser.parse(src);
return {
getA: function() {
return result.default_A;
},
getB: function() {
return result._B;
}
};
}
module.exports = _.memoize(ymlParse);
用法相同,你只需像往常一样调用导出函数。