返回数据的回调函数 - 使其成为匿名函数还是模块?



我用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 的函数一样编写函数,具体取决于您的方式。

最新更新