函数返回未定义的对象

时间:2014-02-13 02:52:48

标签: javascript node.js object

所以我有这个代码:
http://pastebin.com/42aHz5fy(抱歉,我在StackOverflow编辑器中使用<pre>标签失败了)

getStats函数中的console.log()返回一个对象,但在第二个console.log()中(在函数外部,调用它之后),它返回“undefined”。
这是我的控制台:

http://i.stack.imgur.com/aU465.png

为什么返回undefined?

var getStats = function (){
        fs.readFile('Documents/GitHub/kag-gather-irc-bot/stats.json', 'utf8', function (err,data) {
                if (err) {
                        return console.log(err);
                }
                everyStats = JSON.parse(data);
                console.log(everyStats);
                return everyStats;
        });

}
STATS = getStats();
console.log(STATS);

2 个答案:

答案 0 :(得分:1)

您无法从异步方法返回值...对异步调用返回的值所做的所有操作都必须在回调中完成。

所以解决方案是使用一个回调,一旦异步操作完成就会被调用,并且所需的值将作为参数传递给回调

var getStats = function (callback) {
    fs.readFile('Documents/GitHub/kag-gather-irc-bot/stats.json', 'utf8', function (err, data) {
        if (err) {
            return console.log(err);
        }
        everyStats = JSON.parse(data);
        console.log(everyStats);
        callback(everyStats);
    });

}
getStats(function (STATS) {
    console.log(STATS);
});

答案 1 :(得分:0)

因为getStats函数没有返回任何东西,所以只返回fs.readFile参数的函数。

这里我创建了一个回调参数,以便您可以使用回调函数中的everyStats来完成所需的操作。

var getStats = function (callback){
        fs.readFile('Documents/GitHub/kag-gather-irc-bot/stats.json', 'utf8', function (err,data) {
                if (err) {
                        return console.log(err);
                }
                everyStats = JSON.parse(data);
                console.log(everyStats);
                callback(everyStats);
        });

}

getStats(function(stats) {
  // do what you want with stats
});