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

我用JavaScript编写了这个小函数:

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);
                }
            }
        ));
    });
};