Дополнительно
Получение данных из fs.readFile
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Журнал undefined
, почему?
275
15
В дополнение к тому, что сказал @Raynos, функция, которую вы определили, является асинхронным обратным вызовом. Она не выполняется сразу, скорее, она выполняется, когда загрузка файла завершена. Когда вы вызываете readFile, управление возвращается немедленно и выполняется следующая строка кода. Поэтому, когда вы вызываете console.log, ваш обратный вызов еще не был вызван, и это содержимое еще не было установлено. Добро пожаловать в асинхронное программирование.
Пример подходов
Или еще лучше, как показывает пример Raynos, обернуть вызов в функцию и передать собственные обратные вызовы. (Очевидно, это лучшая практика) Я думаю, что если вы выработаете привычку оборачивать свои вызовы async в функцию, которая принимает обратный вызов, это избавит вас от множества проблем и беспорядочного кода.
На самом деле для этого существует функция Synchronous:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Асинхронная
fs.readFile(filename, [encoding], [callback])
Асинхронно считывает все содержимое файла. Пример:_
Обратному вызову передается два аргумента (err, data), где data - содержимое файла.
Если кодировка не указана, то возвращается необработанный буфер._
SYNCHRONOUS
fs.readFileSync(filename, [encoding])
Синхронная версия fs.readFile. Возвращает содержимое файла с именем filename._
Если указана кодировка, то эта функция возвращает строку. В противном случае возвращается буфер._
Используя обещания с ES7
Асинхронные использовать с MZ/Ф
В [
МЗ
] модули(https://www.npmjs.com/package/mz) обеспечивает promisified версии библиотеки ключевых узлов. Использовать их очень просто. Сначала установить библиотеки...Потом...
Кроме того, вы можете написать их в асинхронные функции:
используйте это для вызова файл синхронно, без кодирования его вывода данных в качестве буфера.
Эта линия будет работать,
Как сказал ФС.функцию ReadFile-это асинхронное действие. Это означает, что когда вы говорите узла, чтобы прочитать файл, нужно учитывать, что это займет некоторое время, и в то же время, узел продолжал работать следующий код. В вашем случае это'ы:
приставка.журнала(контент);
.Это's, как отправлять некоторую часть кода для долгой поездки (как читать большой файл).
Взгляните на комменты, что я'вэ написано:
Что's почему "содержание" остается пустым, когда логинишься. узел еще не восстановил файл'с содержании.
Это может быть решена путем перемещения консоли.журнал(содержание) внутри функции обратного вызова, сразу после
контент = данные;
. Таким образом, вы увидите журнал, когда узел производится чтение файла и после "содержание" получает значение.синхронизации и асинхронного чтения файла образом:
Узел чит доступен на read_file.
Использовать встроенные в библиотеке promisify (узел 8+) для того чтобы сделать эти старые функции обратного вызова более элегантным.
Это просто потому, что узел является асинхронным, и он не будет ждать функция чтения, и как только программа начинает это утешит значение undefined, что это на самом деле так, потому что нет значение, присвоенное содержание переменной. Для обработки можно использовать обещания, генераторов и т. д. Мы можем использовать обещание в эту сторону.
Грубо говоря, вы'ре дело с node.js который является асинхронным по своей природе.
Когда мы говорим о async, мы're говоря о выполнении или обработке информации или данных при работе с чем-то еще. Это не синоним параллельно, напоминаем.
Код:
С вашего образца, в основном он делает консоли.журнал часть первая, таким образом, переменная 'и#39; понятие не определено.
Если вы действительно хотите на выходе, сделать что-то вроде этого вместо:
Это является асинхронным. Это будет тяжело привыкнуть, но это. Опять же, это грубое, но быстрое объяснение того, что асинхронность.
вы можете прочитать файл
Добавив на вы можете записать в файл,
и даже цепь вместе
Следующая функция будет работать для
асинхронный
обруч или обещание", затем " цепиконстантный readFileAsync = асинхронный (путь) => ПС.readFileSync(путь, 'в формате utf8');