Какие функции могут работать синхронно в node.js?

Например, я пишу случайный генератор с crypto.randomBytes(...) вместе с другими асинхронными функциями. Чтобы избежать падения аддона, я мог бы использовать функцию синхронизации crypto.randomBytes. Я сомневаюсь, что если я это сделаю, моя программа node будет останавливаться каждый раз, когда я буду выполнять код?. Тогда я подумал, есть ли список асинхронных функций, которые их время для запуска очень короткое, они могут работать как синхронные функции, тогда разработка с помощью этого списка функций будет легкой.

Ответ 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))