Javascript 返回数据的回调函数-使其匿名,是函数还是模块?
我用JavaScript编写了这个小函数:Javascript 返回数据的回调函数-使其匿名,是函数还是模块?,javascript,callback,Javascript,Callback,我用JavaScript编写了这个小函数: var getChampionFile = function(callback){ var championFile = JSON.parse(fs.readFileSync( 'dragontail/championFull.json', 'utf8' )); return callback(championFile); }; 我回电话的原因很明显。因此,当我使用getChampionFile
var getChampionFile = function(callback){
var championFile = JSON.parse(fs.readFileSync(
'dragontail/championFull.json',
'utf8'
));
return callback(championFile);
};
我回电话的原因很明显。因此,当我使用getChampionFile
函数时,我传入一个匿名函数作为回调函数,它只返回championFile
编辑:正如所指出的,回调并不明显。在编写回调时,我使用了fs.readFile
而不是fs.readFileSync
,我没有注意到我在某个地方更改了它(可能是我从internet上接管的,可能是Atom建议的,我不小心使用了它)-对于任何混淆,我深表歉意
现在,我想编写更多使用此getChampionFile
函数的函数。我有以下选择:
- 再次编写匿名函数
- 将匿名函数转换为一个单独的可重用函数,例如,
并将其放在一个单独的模块中,这样我就可以在我的项目中的任何地方使用它,但是需要一个模块来实现一行代码的函数似乎很愚蠢var returnData=function(data){return data;}
- 创建一个不需要回调的函数,调用
,并将匿名函数作为回调传递。(基本上是使用getChampionFile()
而不是return championFile;
的return championFile.data;
)getAllChampions()
推荐的选项/最佳做法是什么?您在这里的评论中有一个误解,这让您陷入了困境: 为了确保在处理.json文件之前读取它,我认为有必要实现回调 它是,如果您正在异步读取它。但您没有,您正在使用
readFileSync
异步读取会更好;同步I/O是NodeJ上的一个主要问题
相反,请异步读取文件,并提供节点样式的回调参数:
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);
}
}
));
});
};
然后,编写函数,就像编写其他节点样式的回调函数或其他启用承诺的函数一样,具体取决于您选择的方式。“我进行回调的原因很明显”根本不明显。您已经编写了一个同步函数,让它调用回调函数,并返回该回调函数的值。这没有任何意义,它不必要地限制了你的选择;相反,只需分别组合这两个函数:
theCallback(getChampionFile())
。不清楚您试图用getChampionFile
中的回调解决什么问题,或者您考虑的三个选项是什么样子的。就目前这个问题而言,我们真的帮不了你。您可以使用“编辑”链接来澄清回调的目的是什么、您的最终目标是什么以及您正在考虑的选项实际上是什么样子吗?不可以。只需从中返回championFile
:var getChampionFile=function(){return JSON.parse(fs.readFileSync('dragontail/championFull.JSON',utf8');}代码>(或更好,使它同步)。同步I/O是NoDEJS中的一个主要的“不”。如果你使它异步,考虑使用<代码>承诺> />代码,这样它就可以通过新的<代码> > <代码>容易地编写、聚合、消耗品……以确保JSON文件在处理它之前被读取,我认为有必要实现回调,因此,我认为这是显而易见的。如果同步读取.json文件,则在继续下一行之前将始终读取该文件。如果不是这样,您将无法将结果直接传递到JSON.parse()
,也无法执行在getChampionFile
中执行的任何其他操作,实现了回调,并在重写函数后意外地将其更改为fs.readFileSync
。很抱歉给您带来任何困惑,谢谢您的精彩解释。@Max:听起来正是我要做的事情。:-)很高兴这有帮助!
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);
}
}
));
});
};