2017-03-29 1 views
4

Ich baue eine Bibliothek, die async/await verwendet, und ich würde gerne wissen, ob es möglich ist, native Module wie fs mit dem async/abwarten zu verwenden. Ich weiß, dass async/warten, es ist nur Versprechen im Hintergrund, also ... Gibt es eine native Möglichkeit, eine Methode oder Funktion zu promiden? Momentan verwende ich den Bluebird, aber ich weiß nicht, ob es ein schlechtes Muster ist. Beispiel:Verwenden von async/await + Bluebird zu promisifyAll

const Bluebird = require("bluebird"); 
const { access } = require("fs"); 

const accessAsync = Bluebird.promisify(access); 

async function checkInput(options) { 
    await accessAsync(options.file); 
    /// etc 
    return options; 
} 

module.exports = (options) => { 
    Promise.resolve(options) 
    .then(checkInput) 
}; 

Ich kombiniere sowohl einheimische Promises und Bluebird. Sollte ich nur Bluebird verwenden?

Danke.

Antwort

3

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.

+0

brillante idea! –

+0

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. –

+0

@BenjaminGruenbaum Danke für die Info. Ich habe die Antwort aktualisiert. – rsp

2

Die Verwendung von Bluebird und Promises erhöht nur Ihren Overhead. Mittel Bluebird ist genug genug, um andere Versprechungen zu behandeln.

Dank

1

Auf alle Fälle ist Bluebird entworfen mit nativen Versprechen zu arbeiten. Der von Ihnen beschriebene Anwendungsfall wird nicht nur unterstützt, sondern ist auch ein Konstruktionsziel von Bluebird.

Bluebirds Versprechen implementieren then nach der Promises/A + -Spezifikation, die garantiert mit await arbeitet. Darüber hinaus können Sie native Versprechen an Bluebird übergeben und es wird gut funktionieren.

Verwandte Themen