2014-02-13 4 views
0

Так что у меня этот код:
http://pastebin.com/42aHz5fy (извините, я не удалось при использовании <pre> тегов в редакторе StackOverflow)Функция Возвращает неопределенный объект

console.log() внутри функции getStats возвращает объект, а во втором console.log() (вне функции, после ее вызова), он возвращает «undefined».
И это моя консоль:

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

Почему возвращения Неопределенные?

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); 
+0

* «Почему возвращения Неопределенные?» * Потому что функция 'getStats' ничего не возвращает. В функции нет оператора 'return'. –

ответ

0

Поскольку функция getStats не возвращает ничего, возвращается только функция, которая является аргументом fs.readFile.

Здесь я сделал аргумент обратного вызова, так что вы можете делать все, что вам нужно, с помощью каждой модели внутри функции обратного вызова.

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

Это дало мне ошибку: http://img513.imageshack.us/img513/6739/g2a3.png Я использую node.js –

+0

@LucasT .: Ошибка для меня довольно очевидна: вы не сделали определить параметр 'callback'. Дважды проверьте, что в этом ответе есть тот же код. –

+0

О, извините, моя ошибка. Все исправлено, спасибо! –

Смежные вопросы