例如,我正在使用 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/