Использование 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 только увеличивает ваши накладные расходы. означает, что синяя птица достаточно для выполнения других обещаний.
Спасибо