var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Логи undefined
, почему?
javascript
node.js
karaxuna
источник
источник
Ответы:
Чтобы пояснить, что сказал @Raynos, определенная вами функция является асинхронным обратным вызовом. Он не выполняется сразу, а выполняется после завершения загрузки файла. Когда вы вызываете readFile, управление возвращается немедленно и выполняется следующая строка кода. Поэтому, когда вы вызываете console.log, ваш обратный вызов еще не был вызван, и этот контент еще не был установлен. Добро пожаловать в асинхронное программирование.
Пример подходов
Или, что еще лучше, как показывает пример Raynos, оберните ваш вызов в функцию и передайте свои собственные обратные вызовы. (Очевидно, это лучшая практика). Я думаю, что привычка оборачивать асинхронные вызовы в функцию, которая принимает обратный вызов, избавит вас от многих хлопот и грязного кода.
источник
'utf8'
после имени файла в качестве дополнительного параметра, иначе он просто вернет буфер. См .: stackoverflow.com/questions/9168737/…На самом деле есть синхронная функция для этого:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Асинхронный
fs.readFile(filename, [encoding], [callback])
Асинхронно читает все содержимое файла. Пример:
Обратному вызову передаются два аргумента (err, data), где data - это содержимое файла.
Если кодировка не указана, возвращается необработанный буфер.
Синхронная
fs.readFileSync(filename, [encoding])
Синхронная версия fs.readFile. Возвращает содержимое файла с именем filename.
Если указано кодирование, то эта функция возвращает строку. В противном случае он возвращает буфер.
источник
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Теперь мы преобразовали буфер в читаемый текст. Это хорошо для чтения открытого текста или проверки файла на соответствие форматам. Я мог бы сделать попытку / поймать, чтобы увидеть, если это, например, файл JSON; но только после того, как буфер преобразован в текст. Посмотрите здесь для получения дополнительной информации: nodejs.org/api/buffer.htmlAF 42 F1
. Очень практично для общения клиент-сервер-клиент.источник
function readContent(callback)
,callback
зарезервированное слово? Я имею в виду, это стандартный способ реализации обратных вызовов для ваших пользовательских функций? Я только начал изучать узел.event
илиc
любое другое имя, которое вам нравится - это не зарезервированное слово в Javascript, и я предполагаю, что то же самое распространяется на Node.js.readContent(function (err, content)
выдает синтаксическую ошибку при использовании функции в качестве параметра.Использование обещаний с ES7
Асинхронное использование с mz / fs
mz
Модуль обеспечивает promisified версии библиотеки ядра узла. Использовать их просто. Сначала установите библиотеку ...Затем...
В качестве альтернативы вы можете написать их в асинхронных функциях:
источник
используйте это для синхронного вызова файла, без кодирования его вывода в виде буфера.
источник
Эта линия будет работать,
источник
fs.readFileSync
Это метод синхронизации, поэтому нет необходимостиawait
. Await полезен с обещаниями ( nodejs.org/api/fs.html#fs_fs_promises_api ), когда вы хотите написать асинхронный код с синтаксисом, похожим на код синхронизации.источник
Синхронизация и асинхронное чтение файла:
Чит-узел доступен в файле read_file .
источник
Как сказано,
fs.readFile
это асинхронное действие. Это означает, что когда вы указываете узлу читать файл, вы должны учитывать, что это займет некоторое время, а тем временем узел продолжал выполнять следующий код. В вашем случае это:console.log(content);
.Это похоже на отправку какой-то части вашего кода в долгое путешествие (например, чтение большого файла).
Посмотрите на комментарии, которые я написал:
Вот почему
content
все еще пусто, когда вы входите в систему. узел еще не получил содержимое файла.Это может быть решено путем перемещения
console.log(content)
внутри функции обратного вызова, сразу послеcontent = data;
. Таким образом, вы увидите журнал, когда узел завершит чтение файла и после того, какcontent
получит значение.источник
Используйте встроенную библиотеку Promisify (Node 8+), чтобы сделать эти старые функции обратного вызова более элегантными.
источник
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, не нужно использовать util.promisify wrap.источник
Это просто потому, что узел асинхронный и он не будет ждать функцию чтения, и, как только программа запустится, он будет поддерживать значение как неопределенное, что на самом деле верно, потому что нет значения, назначенного переменной содержимого. Для обработки мы можем использовать обещания, генераторы и т. Д. Мы можем использовать обещание таким образом.
источник
Следующая функция будет работать для
async
then
цепочек оберток или обещанийисточник
Вы можете прочитать файл по
Добавив, вы можете написать в файл,
и даже связать это вместе
источник
Грубо говоря, вы имеете дело с node.js, который по своей природе асинхронный.
Когда мы говорим об асинхронности, мы говорим о выполнении или обработке информации или данных, когда имеем дело с чем-то другим. Это не синоним параллели, пожалуйста, напомните.
Ваш код:
В вашем примере он в основном выполняет сначала console.log, поэтому переменная 'content' не определена.
Если вы действительно хотите вывод, сделайте что-то вроде этого:
Это асинхронно. Будет трудно привыкнуть, но это то, что есть. Опять же, это грубое, но быстрое объяснение того, что такое асинхронность.
источник