node.js - 哪些函数可以在 Node.js 中同步工作?

标签 node.js asynchronous concurrency

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

最佳答案

使用mz在模块中,您可以使 crypto.randomBytes() 返回一个 promise 。使用 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

我向您展示这些示例是为了证明它不是使用回调 hell 异步和使用漂亮代码同步的选择。实际上,您可以使用新的 async function 以非常优雅的方式运行异步代码。和 await运算符可用于 ES2017 - 很高兴阅读它,因为没有很多人知道这些功能。

关于node.js - 哪些函数可以在 Node.js 中同步工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169448/

相关文章:

javascript - NPM 包最后输出信息

javascript - 如果我在调用异步函数后调用它,为什么我的 Observer 订阅者没有运行?

c - 这可能是 select/poll/epoll/kqueue 的竞争吗?

java - 如何访问线程中 Runnable 对象的字段

java - `obj` 中的 `synchronized(obj) {...}` 参数的目的是什么?

node.js - 如何为我的 bluemix 应用程序强制实现 SSL?

javascript - settimeout 阻塞事件循环 Nodejs 检查下一个示例 :

javascript - 为什么 expressjs 会在每个 OPTIONS 响应中发送 Set-Cookie header ?

c - 异步 ReadDirectoryChangesW - GetQueuedCompletionStatus 总是超时

javascript - 异步问题,JS Promise 无法返回结果,但可以使用 console.log