Utilisation de async / wait + Bluebird pour promisifyAll

Je construis une bibliothèque qui utilise async / wait, et j’aimerais savoir s’il est possible d’utiliser des modules natifs comme fs avec async / wait. Je sais que / async attendent que ce ne sont que des promesses en arrière-plan, alors … existe-t-il un moyen natif de promettre une méthode ou fonction Actuellement, j’utilise le Bluebird, mais je ne sais pas si c’est un mauvais schéma. Exemple:

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) }; 

Je combine les promesses autochtones et Bluebird. Devrais-je utiliser uniquement Bluebird?

Merci.

Je construis une bibliothèque qui utilise async / wait, et j’aimerais savoir s’il est possible d’utiliser des modules natifs comme fs avec async / wait.

Oui. Vous pouvez le faire encore plus simplement avec Bluebird que dans votre exemple:

 let fs = Promise.promisifyAll(require('fs')); // and in async function: let contents = await fs.readFileAsync('file.txt', 'utf-8'); 

Notez que vous devez append Async à la fin des noms de méthodes.

Ou vous pouvez utiliser le module mz sans avoir besoin d’append Async aux méthodes. Voir:

Il existe de nombreux modules dont vous pouvez avoir besoin une fois que vous avez npm install mz . Par exemple, vous pouvez avoir require('mz/fs') et vous permet instantanément d’utiliser la version du module fs qui renvoie les promesses au lieu de prendre des rappels. Associé à async, Wait vous permet de faire des choses comme:

 let fs = require('mz/fs'); // and in async function: let contents = await fs.readFile('file.txt', 'utf-8'); 

Le code ci-dessus n’est toujours pas bloquant.

Voir cette réponse où je montre un exemple de version mz du module de crypto et l’explique plus en détail:

  • Quelles fonctions pourraient fonctionner de manière synchrone dans node.js?

Voir exemple:

 let crypto = require('mz/crypto'); async function x() { let bytes = await crypto.randomBytes(4); console.log(bytes); } 

Vous pouvez faire la même chose avec beaucoup d’autres modules, notamment:

  • child_process
  • crypto
  • dns
  • fs
  • readline
  • zlib

Je sais que / async attendent que ce ne sont que des promesses en arrière-plan, alors … existe-t-il un moyen natif de promettre une méthode ou une fonction?

Bientôt, Node le supportera en natif – voir PR # 5020 Ajout du support principal pour Promises :

mais en attendant, vous pouvez utiliser mz .

Pour plus de contexte, voir également le problème # 7549 v1: l’exécution de fonctions asynchrones sans rappel doit renvoyer des promesses :

Voir aussi le référentiel du groupe de travail sur les promesses du nœud:

Mise à jour: Il semble que le PR 5020 mentionné ci-dessus ne va pas atterrir à Node de si tôt – merci à Benjamin Gruenbaum de l’avoir signalé dans les commentaires. Il semble donc que l’utilisation de promisify et promisifyAll et du module utile mz sera le seul moyen facile d’utiliser les fonctionnalités modernes du langage avec les modules de base de Node. Heureusement, ils fonctionnent très bien, donc ce n’est pas un gros problème.

L’utilisation de Bluebird ainsi que de Promises ne fait qu’augmenter vos dépenses. signifie bluebird est suffisant pour tenir d’autres promesses.

Merci

Bluebird est conçu pour fonctionner avec les promesses des autochtones. Le cas d’utilisation que vous décrivez est non seulement pris en charge, mais constitue un objective de conception de Bluebird.

Les promesses de Bluebird sont then mises en œuvre conformément à la spécification Promises / A +, ce qui garantit un fonctionnement await . De plus, vous pouvez passer les promesses autochtones à Bluebird et tout ira bien.