Какие функции могут работать синхронно в node.js?
Например, я пишу генератор случайных чисел с crypto.randomBytes(...)
наряду с другими асинхронными функциями. Чтобы избежать попадания в ад обратного вызова, я, хотя я мог бы использовать функцию синхронизации crypto.randomBytes
, Я сомневаюсь, что если я сделаю так, моя нодовая программа будет останавливаться при каждом выполнении кода? Тогда я подумал, что если есть список асинхронных функций, время их выполнения очень короткое, они могут работать как синхронные функции, тогда разработка с этим списком функций будет легкой.
2 ответа
С использованием mz
модуль вы можете сделать crypto.randomBytes()
вернуть обещание. С помощью await
(доступно в Узле 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
Или с Узлом 8.x с:
node script-name.js
Я покажу вам эти примеры, чтобы продемонстрировать, что это не выбор асинхронного вызова с адом обратного вызова и синхронизации с хорошим кодом. Вы можете действительно выполнить асинхронный код очень элегантно, используя новый async function
а также await
Оператор доступен в ES2017 - об этом стоит прочитать, потому что об этих функциях мало кто знает.
Они асинхронные, учатся с этим справляться.
Обещания сейчас и в будущем 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))