例如,我正在编写一个带有crypto.randomBytes(...)
的随机生成器以及另一个异步函数。为了避免陷入回调地狱,我虽然可以使用crypto.randomBytes
的同步功能。我怀疑的是,如果我这样做,我的节点程序将在每次执行代码时停止?然后我想如果有一个异步函数列表,它们的运行时间非常短,这些可以作为同步函数,那么用这个函数列表开发就很容易。
答案 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
中提供的新await
和ES2017运算符以非常优雅的方式运行异步代码 - 因为很多人都不会阅读它了解这些功能。
答案 1 :(得分:0)
他们是异步的,学会处理它。
Promises现在,将来ES2017 await
和async
将让您的生活更轻松。
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))