Например, я пишу случайный генератор с crypto.randomBytes(...)
вместе с другими асинхронными функциями. Чтобы избежать падения аддона, я мог бы использовать функцию синхронизации crypto.randomBytes
. Я сомневаюсь, что если я это сделаю, моя программа node будет останавливаться каждый раз, когда я буду выполнять код?. Тогда я подумал, есть ли список асинхронных функций, которые их время для запуска очень короткое, они могут работать как синхронные функции, тогда разработка с помощью этого списка функций будет легкой.
Какие функции могут работать синхронно в node.js?
Ответ 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 - хорошо читать об этом, потому что не многие знают о эти функции.
Ответ 2
Они асинхронны, учатся справляться с этим.
Promises сейчас, а в будущем ES2017 await
и async
сделает вашу жизнь намного проще.
Bluebirds promisifyAll
чрезвычайно полезен при работе с любым стандартным API-интерфейсом обратного вызова Node.js. Он добавляет функции с тегами async
, которые возвращают обещание вместо того, чтобы требовать обратного вызова.
const Promise = require('bluebird')
const crypto = Promise.promisifyAll(require('crypto'))
function randomString() {
return crypto.randomBytesAsync(4).then(bytes => {
console.log('got bytes', bytes)
return bytes.toString('hex')
})
}
randomString()
.then(string => console.log('string is', string))
.catch(error => console.error(error))