Использование async/wait + Bluebird для promisifyAll

Я создаю библиотеку, которая использует async/await, и мне хотелось бы знать, можно ли использовать собственные модули, например fs, с помощью async/await. Я знаю, что async/ждет его только Promises в фоновом режиме, так что... есть ли собственный способ обещать метод или функцию? В настоящее время я использую Bluebird, но я не знаю, плохо ли это. Пример:

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

Я сочетаю как родные Promises, так и Bluebird. Должен ли я использовать Bluebird?

Спасибо.

Ответ 1

Я создаю библиотеку, которая использует async/await, и мне хотелось бы знать, можно ли использовать собственные модули, например fs, с помощью async/await.

Да. Вы можете сделать это еще проще с Bluebird, чем в вашем примере:

let fs = Promise.promisifyAll(require('fs'));

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

Обратите внимание, что вам нужно добавить Async в конце имен методов.

Или вы можете использовать модуль mz, не добавляя Async к методам. См:

Существует много модулей, которые вы можете потребовать после npm install mz - например, вы можете require('mz/fs'), и он мгновенно позволяет использовать версию модуля fs, которая возвращает promises вместо принятия обратных вызовов. В сочетании с асинхронным ожиданием он позволяет вам делать такие вещи, как:

let fs = require('mz/fs');

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

Вышеприведенный код по-прежнему не блокирует.

См. этот ответ, где я показываю пример версии mz модуля crypto и объясняю его более подробно:

См. пример:

let crypto = require('mz/crypto');

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

Вы можете сделать то же самое со многими другими модулями, включая:

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

Я знаю, что async/ждут его просто promises в фоновом режиме, поэтому... есть ли собственный способ обещать метод или функцию?

Вскоре Node будет поддерживать это изначально - см. PR # 5020 Добавление поддержки Core для Promises:

но в то же время вы можете использовать mz.

Для получения дополнительной информации см. также Проблема # 7549 v1: выполнение async-функций без обратных вызовов должно возвращать Promises:

См. также Node Promises репозиторий рабочей группы:

Обновление: Кажется, что PR 5020, упомянутый выше, не собирается приземляться в Node в ближайшее время - благодаря Бенджамину Груэнбауму, чтобы указать на это в комментариях. Таким образом, кажется, что использование Bluebird promisify и promisifyAll и полезный mz модуль будут единственным простым способом использования современных функций языка с основными модулями node. К счастью, они работают очень хорошо, поэтому это не большая проблема.

Ответ 2

Использование Bluebird, а также Promises только увеличивает вашу голову. означает, что bluebird достаточно для обработки других promises.

Спасибо

Ответ 3

В любом случае, bluebird предназначен для работы с native promises. Описанный вами вариант использования не только поддерживается, но и является целью разработки Bluebird.

Bluebird promises реализует then в соответствии со спецификацией Promises/A +, которая гарантированно работает с await. Более того, вы можете передать native promises в bluebird, и он будет работать нормально.