Lesen der Datei mit ES6 verspricht
let arr = [];
function getData(fileName, type) {
return fs.readFile(fileName,'utf8', (err, data) => {
if (err) throw err;
return new Promise(function(resolve, reject) {
for (let i = 0; i < data.length; i++) {
arr.push(data[i]);
}
resolve();
});
});
}
getData('./file.txt', 'sample').then((data) => {
console.log(data);
});
Wenn ich obigen code und führen Sie es in der Befehlszeile mithilfe von nodejs, bekomme ich folgende Fehlermeldung.
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
Wie kann ich dieses Problem lösen?
Swap
und sollten Sie
Wie schon angedeutet, von Marty sind Sie wieder, die Ergebnis des
return fs.readFile
mit return new Promise()
. Du bist der Rückkehr fs.readFile
welche keinen Rückgabewert hat.und sollten Sie
reject
statt throw
Wie schon angedeutet, von Marty sind Sie wieder, die Ergebnis des
fs.readFile()
ist nicht ein Versprechen per definition als die aktuelle version. Sie sind wohl verwirrt, beruht auf der Tatsache, dass in einer then()
anderen Versprechen zurückgegeben werden, und würde dann verkettet werden.InformationsquelleAutor 2619 | 2016-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie wollen, wickeln Sie die gesamte
fs.readFile
Aufruf in einer neuenPromise
, und dann ablehnen oder auflösen, die Versprechen, je nach dem Rückruf Folge:InformationsquelleAutor hackerrdave
Niemand gesagt, über
util.promisify
also werde ich posten, egal wie alt die Frage ist.Warum haben Sie diese Nachricht?
getData
ist ein wrapper fürfs.readFile
- Datei hier.fs.readfile
ist nicht ein thenable (es nicht zu implementierenthen
- Funktion). Es baut auf die anderen Muster, die callback-Muster. Die bekanntesten thenable werden Verspricht, und das ist, was Sie möchten erhalten vonreadFile
glaube ich. Eine kleine Erinnerung: Mozilla VersprichtAlso, was Sie tun können, ist, entweder es selbst implementieren, wie hat @hackerrdave oder ich würde vorschlagen, mit
promisify
: diese Funktion ist eine integrierte Funktion von Node.js umgesetzt wurde das transformieren der callback-basierte Funktion in versprochen basiert. Sie finden es hier: Node.js Dokumentation util.promisfyEs im Grunde genommen das gleiche wie @hackerrdave es ist aber mehr robust und built-in-Knoten-util.
Hier ist, wie es zu benutzen:
const promisify = require('util').promisify;
, und dann direktpromisify(fs.readFile)("path/to/myfile").then( ... )
. Denken Sie daran, die Fehler argument der normalen Rückruf nicht vorhanden sein, inthen
Funktion, aber in dercatch
In der Tat, ich hinzufügen wird der catch-Anweisung, wird es verständlicher. Und ich ll zu Bearbeiten als auch die require-Anweisung, ich glaube nicht, dass aber keine Notwendigkeit zu verlangen, das ganze util.
Es gibt auch npmjs.com/package/fs-extra
InformationsquelleAutor Théophile Pace
Hier ist ein one-liner wie der Knoten 10.2.0:
(async () => console.log(String(await require('fs').promises.readFile('./file.txt'))))();
Ja, es ist jetzt out of the box.
InformationsquelleAutor Elias Goss
return
verwechseln kann der OP mehr?Ich glaube, Sie brauchen, um
return
dienew Promise
Zeile, sonst getData wird nichtthen
definiert.Die
return
ist implizit mit Pfeiltasten die Funktionen ohne Klammern.InformationsquelleAutor adrice727
Update für den aktuellen Knoten Als der Knoten 10.0.0 Sie können jetzt
fs.verspricht
:InformationsquelleAutor mikemaccana