Ответ 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. К счастью, они работают очень хорошо, поэтому это не большая проблема.