web-dev-qa-db-fra.com

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 promouvoir une méthode ou une 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.

6
user5487299

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 ajouter Async à la fin des noms de méthodes.

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

Il existe de nombreux modules dont vous pouvez avoir besoin une fois npm install mz - par exemple, vous pouvez require('mz/fs') et vous permet instantanément d'utiliser la version du module fs qui renvoie des 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 crypto et l'explique plus en détail:

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 promouvoir une méthode ou une fonction?

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

mais entre-temps, vous pouvez utiliser mz.

Pour plus de contexte, voir aussi le Problème n ° 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 qu'utiliser les variables promisify et promisifyAll de Bluebird et le 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.

6
rsp

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

2
Amulya Kashyap

Par tous les moyens, bluebird est conçu pour travailler avec les promesses autochtones. Le cas d'utilisation que vous décrivez est non seulement pris en charge, mais constitue un objectif de conception de Bluebird.

Les promesses de Bluebird implémentent then conformément à la spécification Promises/A +, qui fonctionne avec await. De plus, vous pouvez passer les promesses autochtones à Bluebird et tout ira bien.

1
Benjamin Gruenbaum