我在JavaScript中编写了这个小函数:
var getChampionFile = function(callback){
var championFile = JSON.parse(fs.readFileSync(
'dragontail/championFull.json',
'utf8'
));
return callback(championFile);
};
我出于明显的原因进行了回电。因此,当我使用getChampionFile
函数时,我将一个匿名函数作为回调传递,只返回championFile
。
编辑:正如所指出的,回调并不明显。在编写回调时,我使用了fs.readFile
而不是fs.readFileSync
,我没有注意到我在路上的某个地方已经改变了它(也许我从互联网上接过它,也许Atom建议我和我意外地使用它它) - 抱歉任何混乱。
var getAllChampions = function(){
var championFile = getChampionFile(function (championFile){
return championFile;
});
return championFile.data;
};
现在我想写一些使用这个getChampionFile
函数的函数。我有以下选择:
var returnData = function(data){return data;}
并将其放在一个单独的模块中,这样我就可以在我的项目中的任何地方使用它,但需要一个模块来处理一行代码看似愚蠢的函数。getChampionFile()
并将匿名函数作为回调传递。 (基本上getAllChampions()
使用return championFile;
代替return championFile.data;
)建议的选项/最佳做法是什么?
答案 0 :(得分:1)
你在评论中有误解,这有点让你陷入了兔子洞:
为了确保在处理之前读取.json文件,我认为有必要实现回调。
是,如果,您正在异步读取它。但你不是,你正在使用readFileSync
。
异步读取它会好得多;同步I / O是NodeJS上的主要禁忌。
相反,请异步读取文件并提供节点样式的回调参数:
var getChampionFile = function(callback) {
fs.readFile('dragontail/championFull.json', 'utf8', function(err, data) {
if (err) {
callback(err);
} else {
try {
callback(null, JSON.parse(data));
} catch (e) {
callback(e);
}
}
));
};
...或者创建一个启用Promise的函数:
var getChampionFile = function() {
return new Promise(function(resolve, reject) {
fs.readFile('dragontail/championFull.json', 'utf8', function(err, data) {
if (err) {
reject(err);
} else {
try {
resolve(JSON.parse(data));
} catch (e) {
reject(e);
}
}
));
});
};
然后,编写函数就像编写其他Node样式的回调函数或其他启用Promise的函数一样,具体取决于你去哪种方式。