Ответ 1
Используя модуль mz
, вы можете сделать crypto.randomBytes()
возврат обещания. Используя await
(доступно в Node 7.x, используя флаг --harmony
), вы можете использовать его следующим образом:
let crypto = require('mz/crypto');
async function x() {
let bytes = await crypto.randomBytes(4);
console.log(bytes);
}
x();
Приведенный выше неблокирующий, хотя он выглядит как блокирующий.
Для лучшей демонстрации рассмотрите этот пример:
function timeout(time) {
return new Promise(res => setTimeout(res, time));
}
async function x() {
for (let i = 0; i < 10; i++) {
console.log('x', i);
await timeout(2000);
}
}
async function y() {
for (let i = 0; i < 10; i++) {
console.log('y', i);
await timeout(3000);
}
}
x();
y();
И обратите внимание, что для выполнения этих двух функций требуется много времени, но они не блокируют друг друга.
Запустите его с помощью Node 7.x, используя:
node --harmony script-name.js
Или с Node 8.x с:
node script-name.js
Я покажу вам эти примеры, чтобы продемонстрировать, что это не выбор асинхронизации с аддоном обратного вызова и синхронизация с хорошим кодом. Вы действительно можете запустить асинхронный код очень элегантно, используя новый async function
и await
, доступный в ES2017 - хорошо читать об этом, потому что не многие знают о эти функции.