哪些函数可以在node.js中同步?

时间:2017-02-10 22:08:13

标签: node.js asynchronous concurrency

例如,我正在编写一个带有crypto.randomBytes(...)的随机生成器以及另一个异步函数。为了避免陷入回调地狱,我虽然可以使用crypto.randomBytes的同步功能。我怀疑的是,如果我这样做,我的节点程序将在每次执行代码时停止?然后我想如果有一个异步函数列表,它们的运行时间非常短,这些可以作为同步函数,那么用这个函数列表开发就很容易。

2 个答案:

答案 0 :(得分: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

或者使用Node 8.x:

node script-name.js

我向您展示这些示例,以证明它不是选择与回调地狱异步并与漂亮的代码同步。实际上,您可以使用async function中提供的新awaitES2017运算符以非常优雅的方式运行异步代码 - 因为很多人都不会阅读它了解这些功能。

答案 1 :(得分:0)

他们是异步的,学会处理它。

Promises现在,将来ES2017 awaitasync将让您的生活更轻松。

在处理任何标准Node.js回调API时,

Bluebirds promisifyAll非常有用。它添加了用Async标记的函数,这些函数返回一个promise而不需要回调。

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))