Использование async/await + Bluebird для обещанияВсе

Я создаю библиотеку, которая использует async/await, и я хотел бы знать, возможно ли использовать нативные модули, такие как fs, с async/await. Я знаю, что async/await это просто 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)
};

Я объединяю как родные Обещания, так и Синюю птицу. Должен ли я использовать только Bluebird?

Благодарю.

3 ответа

Решение

Я создаю библиотеку, которая использует 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 версия модуля, которая возвращает обещания, а не обратные вызовы. В сочетании с асинхронным ожиданием это позволяет делать такие вещи, как:

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 / await это просто Promises в фоновом режиме, так что... есть ли родной способ обещать метод или функцию?

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

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

Дополнительную информацию см. Также в выпуске № 7549 v1: выполнение асинхронных функций без обратных вызовов должно возвращать обещания:

Смотрите также репозиторий рабочей группы по обещаниям узла:

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

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

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

Использование Bluebird и Promises только увеличивает ваши накладные расходы. означает, что синяя птица достаточно для выполнения других обещаний.

Спасибо

Другие вопросы по тегам