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

时间:2017-08-16 16:06:21

标签: javascript callback

我在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;

建议的选项/最佳做法是什么?

1 个答案:

答案 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的函数一样,具体取决于你去哪种方式。