Почему возвращает undefined? [дубликат]

107
28 сентября 2019, 03:30

На данный вопрос уже ответили:

  • Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания 3 ответа
var
    fs  = require('fs'),
    dir = "header.html";
function getFile(dir) {
  var res;
  fs.stat(dir, function(err, stats) {
    if(err)
      return console.log(err);
    fs.readFile(dir, function(err, data) {
      res = new Buffer( data );
    });
  });
  return res;
}
console.log( getFile(dir) );

Данный код возвращает undefined и никак не пойму почему же это происходит. Заранее спасибо!

Answer 1

Вы изспользуете асинхронныые функции (всякая функция с коллбэком, как правило, асинхронная). Сам их смысл в том, что результат их работы вы можете получить только внутри коллбэка. Результат работы fs.stat() доступен внутри её коллбэка и перередаётся там fs.readFile(), а результат работы fs.readFile() доступен уже только внутри её коллбэка, второго уровня вложенности, и т.д. Когда вы возвращаете return res;, fs.stat() ещё не окончила работу, а fs.readFile() ещё даже не начала, поэтому значение res возвращается сразу после объявления, когда оно всё ещё undefined. Получить содержимое файла и вывести его в console.log() можно только внутри самого глубокого коллбэка:

var
    fs  = require('fs'),
    dir = "header.html";
function getFile(dir) {
  fs.stat(dir, function(err, stats) {
    if(err)
      return console.log(err);
    fs.readFile(dir, function(err, data) {
      var res = new Buffer( data );
      console.log(res);
    });
  });
}
getFile(dir);

Синхронный вариант:

'use strict';
var
    fs  = require('fs'),
    dir = "header.html";
function getFile(dir) {
  var stats = fs.statSync(dir);
  var res = fs.readFileSync(dir);
  return res;
}
console.log( getFile(dir) );
READ ALSO
Как подключить autoplay к слайдеру?

Как подключить autoplay к слайдеру?

есть слайдер к которому нужно подключить autoplayПоискал ответы в интернете, не один не помог, а чтобы написать самому скрипт знаний маловато

108
Помогите разобраться с Promise

Помогите разобраться с Promise

Создать класс, который производит экземпляр со следующими свойствами: - promise - промис, который создается во время запуска конструктора; - reject...

112
innerHTML не изменяет данные

innerHTML не изменяет данные

Всем привет, есть вот такая диллема, и я не могу понять что здесь происходит:

97