Ich möchte async / await für einige Dateisystemoperationen verwenden. Normalerweise funktioniert async / await einwandfrei, da ich es verwende babel-plugin-syntax-async-functions
.
Aber mit diesem Code stoße ich auf den if-Fall, in dem names
undefiniert ist:
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();
Wenn ich den Code in die Callback-Hell-Version umbaue, ist alles in Ordnung und ich erhalte die Dateinamen. Vielen Dank für Ihre Hinweise.
javascript
node.js
async-await
fs
Quellenangeber
quelle
quelle
SyntaxError: Unexpected token import
Fehlermeldung angezeigt . Unterstütztimport
Node8 standardmäßig Token?import
Syntax. Es erfordert derzeit einige Transpiling. Wäre in Ordnung, auch zu verwendenconst fs = require('fs')
oderconst { promisify } = require('util')
{err, names} = function
Syntax?names = await readdir('path/to/dir');
und wenn es einerr
Handle imcatch
Block gibt. In jedem Fall ist der Name der Syntax eine Destrukturierungszuweisung, die nur eine Antwort auf Qasims Frage war.Die native Unterstützung für Async wartet seit Knoten 11 auf fs-Funktionen
Seit Node.JS 11.0.0 (stabil) und Version 10.0.0 (experimentell) haben Sie Zugriff auf Dateisystemmethoden, die bereits versprochen wurden, und Sie können sie mit
try catch
Ausnahmebehandlung verwenden, anstatt zu überprüfen, ob der zurückgegebene Wert des Rückrufs enthält ein Fehler.Die API ist sehr sauber und elegant! Verwenden Sie einfach ein
.promises
Mitglied desfs
Objekts:quelle
return await
Ihr Versprechen nicht einhalten, nützt der Fangblock nichts ... Ich denke, es ist manchmal eine gute Praxis, vor der Rückkehr abzuwartenNode.js 8.0.0
Native async / warten
Versprich es mir
Ab dieser Version können Sie die native Node.js-Funktion aus der util- Bibliothek verwenden.
Promise Wrapping
Rat
Verwenden
try..catch
Sie diese Option immer für Warteblöcke, wenn Sie die obere Ausnahme nicht erneut auslösen möchten.quelle
await
muss immer imasync
Block sein :)const res = await readFile('data.json') console.log(res)
in einer asynchronen Funktionfs.promises
und damit zu benutzen,async/await
ist für mich so verwirrendthen
,catch
usw. Wo sind async / await ist modern Verhalten fließen.Möglicherweise führen Sie zu einem falschen Verhalten, da die Datei-API
fs.readdir
kein Versprechen zurückgibt. Es dauert nur einen Rückruf. Wenn Sie mit der Async-Wait-Syntax arbeiten möchten, können Sie die Funktion wie folgt "versprechen":und nenne es stattdessen:
quelle
Ab Version 10.0 können Sie verwenden
fs.Promises
Beispiel mit
readdir
Beispiel mit
readFile
quelle
ExperimentalWarning: The fs.promises API is experimental
Warnung zu beachten : github.com/pnpm/pnpm/issues/1178v10.15.3
- Es ist möglich, die Nachricht zu unterdrücken. Da das Thema jedoch noch offen ist, hielt ich es für erwähnenswert.readFile
? Ich bin neu in dieser ganzen Versprechenssache, und alles, was ich tun möchte, ist eine Funktion zu habengetContent
, die ich in verschiedenen Teilen meines Skripts aufrufen und abwarten kann, aber dies erweist sich als sehr verwirrendDies ist die TypeScript-Version der Frage. Es kann nach Knoten 11.0 verwendet werden:
quelle
Folgendes hat bei mir funktioniert:
Dieser Code funktioniert in Knoten 7.6 ohne Babel, wenn das Harmony-Flag aktiviert ist :
node --harmony my-script.js
. Und ab Knoten 7.7 brauchen Sie nicht einmal dieses Flag !Die
fsp
am Anfang enthaltene Bibliothek ist nur ein vielversprechender Wrapper fürfs
(undfs-ext
).Ich bin wirklich gespannt, was man heutzutage in Node ohne Babel machen kann! Native
async
/await
machen das Schreiben von Code zu einem Vergnügen!UPDATE 2017-06: Das Modul fs-versprechen ist veraltet. Verwenden Sie
fs-extra
stattdessen mit derselben API.quelle
Empfehlen Sie die Verwendung eines npm-Pakets wie https://github.com/davetemplin/async-file im Vergleich zu benutzerdefinierten Funktionen. Beispielsweise:
Andere Antworten sind veraltet
quelle
Ich habe dieses kleine Hilfsmodul , das vielversprechende Versionen von
fs
Funktionen exportiertquelle
Knoten v14.0.0 und höher
Sie können einfach tun:
genau wie Sie aus importieren würden
"fs"
Weitere Informationen finden Sie in dieser PR: https://github.com/nodejs/node/pull/31553
quelle