Я хотел бы использовать async / await с некоторыми операциями файловой системы. Обычно async / await отлично работает, потому что я использую babel-plugin-syntax-async-functions
.
Но с этим кодом я сталкиваюсь с случаем if, где names
undefined:
import fs from 'fs';
async function myF() {
let names;
try {
names = await fs.readdir('path/to/dir');
} catch (e) {
console.log('e', e);
}
if (names === undefined) {
console.log('undefined');
} else {
console.log('First Name', names[0]);
}
}
myF();
Когда я перестраиваю код в адскую версию обратного вызова, все в порядке, и я получаю имена файлов. Спасибо за подсказки.
javascript
node.js
async-await
fs
Quellenangeber
источник
источник
SyntaxError: Unexpected token import
сообщение об ошибке. поддерживает ли node8import
токен по умолчанию?import
синтаксис. В настоящее время требуется некоторая транспиляция. Можно было бы также использоватьconst fs = require('fs')
илиconst { promisify } = require('util')
{err, names} = function
называется синтаксис?names = await readdir('path/to/dir');
и еслиerr
вcatch
блоке есть дескриптор . В любом случае название синтаксиса - деструктурирующее присвоение, которое было как раз в ответ на вопрос Касима.Встроенная поддержка функций async await fs начиная с Node 11
Начиная с Node.JS 11.0.0 (стабильный) и версии 10.0.0 (экспериментальный), у вас есть доступ к уже обещанным методам файловой системы, и вы можете использовать их с
try catch
обработкой исключений, а не проверять, содержит ли возвращаемое значение обратного вызова ошибка.API очень чистый и элегантный! Просто используйте
.promises
членfs
объекта:источник
return await
обещаете, блок catch бесполезен ... Я думаю, что иногда полезно подождать, прежде чем вернутьсяNode.js 8.0.0
Собственный async / await
Promisify
В этой версии вы можете использовать встроенную функцию Node.js из библиотеки util .
Обещание упаковки
Совет
Всегда используйте
try..catch
для блоков ожидания, если вы не хотите повторно генерировать исключение наверху.источник
await
всегда должен быть вasync
блоке :)const res = await readFile('data.json') console.log(res)
в некоторой асинхронной функцииfs.promises
async/await
then
иcatch
т. Д. Где async / await - это современный поток поведения.Вы можете вызвать неправильное поведение, потому что File-Api
fs.readdir
не возвращает обещание. Требуется только обратный вызов. Если вы хотите использовать синтаксис async-await, вы можете «обещать» функцию следующим образом:и назовите его вместо этого:
источник
Начиная с версии 10.0 , вы можете использовать
fs.Promises
Пример использования
readdir
Пример использования
readFile
источник
ExperimentalWarning: The fs.promises API is experimental
v10.15.3
- сообщение можно подавить. Однако, поскольку проблема все еще не решена, я подумал, что об этом стоит упомянуть.readFile
,? Я новичок во всей этой штуке с обещаниями, и все, что я хочу сделать, это иметь функцию,getContent
которую я могу вызывать и ожидать в различных частях моего сценария, но это оказывается очень запутаннымЭто версия TypeScript к вопросу. Его можно использовать после Node 11.0:
источник
Вот что у меня сработало:
Этот код работает в узле 7.6 без Бабеля , когда флаг гармонии включен:
node --harmony my-script.js
. А начиная с узла 7.7 вам даже не нужен этот флаг !fsp
Библиотека включена в начале это просто promisified обертка дляfs
(аfs-ext
).Я действительно в восторге от того, что вы можете делать в node без Babel в наши дни! Нативный
async
/await
сделать написание кода таким удовольствием!ОБНОВЛЕНИЕ 2017-06: модуль fs- prom устарел.
fs-extra
Вместо этого используйте тот же API.источник
Рекомендуется использовать пакет npm, такой как https://github.com/davetemplin/async-file , по сравнению с пользовательскими функциями. Например:
Другие ответы устарели
источник
У меня есть небольшой вспомогательный модуль, который экспортирует обещанные версии
fs
функций.источник
Node v14.0.0 и выше
вы можете просто сделать:
так же, как вы бы импортировали из
"fs"
см. этот PR для более подробной информации: https://github.com/nodejs/node/pull/31553
источник