Какие функции могут работать синхронно в 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))
Другие вопросы по тегам