我用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;}
并将其放在一个单独的模块中,以便我可以在我的项目中的任何地方使用它,但是需要一个模块来执行 1 行代码的函数似乎很愚蠢。 - 创建一个不需要回调的函数,调用
getChampionFile()
并将匿名函数作为回调传递。(基本上用return championFile;
而不是return championFile.data;
getAllChampions()
(
推荐的选项/最佳实践是什么?
你在这里的评论中有一个误解,这有点让你掉进了兔子洞:
为了确保在处理.json文件之前读取它,我认为有必要实现回调。
如果你是异步阅读的,它是。但你不是,你正在使用readFileSync
.
异步读取它会好得多;同步 I/O 是 NodeJS 的主要禁忌。
相反,异步读取文件并提供 Node 样式的回调参数:
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);
}
}
));
};
。或改为创建启用承诺的函数:
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 的函数一样编写函数,具体取决于您的方式。