Ich bin Bau einer Bibliothek, die async/await, und ich würde gerne wissen, ob es möglich ist, verwenden nativen Module wie fs mit dem Asynchron/await verwendet.
Ja. Sie können es auch mit Drossel einfacher als in Ihrem Beispiel:
let fs = Promise.promisifyAll(require('fs'));
// and in async function:
let contents = await fs.readFileAsync('file.txt', 'utf-8');
Beachten Sie, dass Sie benötigen Async
am Ende der Methodennamen hinzuzufügen.
Oder Sie können das mz
Modul verwenden, ohne Async
zu den Methoden hinzufügen zu müssen. Siehe:
Es gibt viele Module, die Sie, wenn Sie benötigen, können npm install mz
- zum Beispiel können Sie require('mz/fs')
und es können sofort verwenden Sie die fs
Modul-Version, die Versprechen statt Einnahme Rückrufe zurückgibt. Kombiniert mit async erwarten Sie können Sie Dinge tun wie:
let fs = require('mz/fs');
// and in async function:
let contents = await fs.readFile('file.txt', 'utf-8');
Der obige Code ist immer noch nicht blockiert.
diese Antwort sehen, wo ich ein Beispiel für mz
Version des crypto
Modul zeigen und es näher erläutern:
Siehe Beispiel:
let crypto = require('mz/crypto');
async function x() {
let bytes = await crypto.randomBytes(4);
console.log(bytes);
}
Sie können das gleiche mit vielen anderen Modulen tun s, einschließlich:
child_process
crypto
dns
fs
readline
zlib
Ich weiß, dass async/erwarten, es ist nur Versprechen im Hintergrund, also ... gibt es eine native Möglichkeit, eine Methode oder Funktion zu promisifizieren?
Bald werden Knoten, die nativ unterstützen - PR # 5020 Hinzufügen von Core-Unterstützung für Promises sehen:
aber in der Zwischenzeit können Sie mz
verwenden.
Weitere Zusammenhang auch die Issue # 7549 v1: Funktionen Asynchron-Ausführung ohne Rückrufe sollten zurückkehren Versprechen:
Siehe auch die Promises Arbeitsgruppe Repository der Knoten:
Update: Es scheint, dass die PR-5020 oben erwähnt wird nicht in absehbarer Zeit in Knoten gehen zu landen - dank Benjamin Grünbaum es für den Hinweis in den Kommentaren aus. So scheint es, dass mit Bluebird promisify
und und die hilfreiche mz
Modul die einzige einfache Möglichkeit ist, moderne Features der Sprache mit den Kern-Module von Node zu verwenden. Zum Glück funktionieren sie sehr gut, es ist also kein großes Problem.
brillante idea! –
Ich hasse es, ein Party-Pooper zu sein - # 5020 passiert nicht so bald. Ich habe die Arbeitsgruppe für Verheißungen gegründet - leider - weil es so viel Arbeit kostet, geht es momentan nicht weiter. Es gibt eine Chance, dass "util.waitable" in den kommenden Monaten landen wird. –
@BenjaminGruenbaum Danke für die Info. Ich habe die Antwort aktualisiert. – rsp