Chciałbym używać async / await z niektórymi operacjami na systemie plików. Zwykle async / await działa dobrze, ponieważ używam babel-plugin-syntax-async-functions
.
Ale z tym kodem napotykam przypadek if, w którym names
jest niezdefiniowany:
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();
Kiedy przebudowuję kod na wersję callback hell, wszystko jest w porządku i otrzymuję nazwy plików. Dzięki za podpowiedzi.
javascript
node.js
async-await
fs
Quellenangeber
źródło
źródło
SyntaxError: Unexpected token import
komunikat o błędzie. czy node8 domyślnie obsługujeimport
token?import
składni. Obecnie wymaga transpilacji. Byłoby w porządku, aby również użyćconst fs = require('fs')
lubconst { promisify } = require('util')
{err, names} = function
nazywa się składnia?names = await readdir('path/to/dir');
i jeśli jesterr
uchwyt wcatch
bloku. Tak czy inaczej, nazwa składni to destrukturyzujące przypisanie, które było właśnie odpowiedzią na pytanie Qasima.Natywne wsparcie dla funkcji async await fs od Node 11
Od wersji Node.JS 11.0.0 (stabilna) i 10.0.0 (eksperymentalna) masz dostęp do metod systemu plików, które są już obiecane i możesz ich używać z
try catch
obsługą wyjątków zamiast sprawdzać, czy zwrócona wartość wywołania zwrotnego zawiera błąd.Interfejs API jest bardzo czysty i elegancki! Po prostu użyj
.promises
członkafs
obiektu:źródło
return await
obiecasz, blokada na nic się nie przyda ... Myślę, że czasami dobrą praktyką jestNode.js 8.0.0
Natywny async / await
Promisify
Od tej wersji można używać natywnej funkcji Node.js z biblioteki util .
Pakowanie obietnic
Rada
Zawsze używaj
try..catch
dla bloków await, jeśli nie chcesz ponownie wyrzucać wyjątku górnego.źródło
await
zawsze musi być wasync
bloku :)const res = await readFile('data.json') console.log(res)
w jakiejś funkcji asynchronicznejfs.promises
i używania jejasync/await
jest dla mnie tak mylącathen
,catch
itd. Gdzie są asynchroniczne / Oczekujcie jest nowoczesny przepływ zachowanie.Możesz uzyskać niewłaściwe zachowanie, ponieważ File-Api
fs.readdir
nie zwraca obietnicy. Wystarczy oddzwonić. Jeśli chcesz korzystać ze składni async-await, możesz `` obiecać '' funkcję w następujący sposób:i nazwij to zamiast tego:
źródło
Od wersji 10.0 możesz używać
fs.Promises
Przykład użycia
readdir
Przykład użycia
readFile
źródło
ExperimentalWarning: The fs.promises API is experimental
ostrzeżenia: github.com/pnpm/pnpm/issues/1178v10.15.3
- można ukryć komunikat. Jednak mając wciąż otwarty problem, pomyślałem, że warto o nim wspomnieć.readFile
? Jestem nowy w tej całej sprawie obietnic i wszystko, czego chcę, to mieć funkcję,getContent
którą mogę wywołać i czekać w różnych częściach mojego skryptu, ale to okazuje się bardzo zagmatwaneTo jest wersja TypeScript pytania. Można go używać po Węzeł 11.0:
źródło
Oto, co zadziałało dla mnie:
Ten kod działa w węźle 7.6 bez babel gdy flaga harmonia jest włączona:
node --harmony my-script.js
. Począwszy od węzła 7.7, nie potrzebujesz nawet tej flagi !fsp
Biblioteka zawarte na początku jest tylko promisified wrapper dlafs
(ifs-ext
).Jestem naprawdę podekscytowany tym, co możesz teraz zrobić w Node bez Babel! Native
async
/await
sprawiają, że pisanie kodu to taka przyjemność!UPDATE 2017-06: moduł fs-promise został wycofany.
fs-extra
Zamiast tego użyj tego samego interfejsu API.źródło
Zaleca się używanie pakietu npm, takiego jak https://github.com/davetemplin/async-file , w porównaniu z funkcjami niestandardowymi. Na przykład:
Inne odpowiedzi są nieaktualne
źródło
Mam ten mały moduł pomocniczy, który eksportuje obiecane wersje
fs
funkcjiźródło
Węzeł 14.0.0 i nowsze
możesz po prostu zrobić:
tak jak importujesz z
"fs"
zobacz ten PR, aby uzyskać więcej informacji: https://github.com/nodejs/node/pull/31553
źródło