哪些函数可以在node.js中同步工作?
例如,我正在写随机生成器与crypto.randomBytes(...)
以及另一个asynchronous函数。 为了避免callback地狱,我虽然我可以使用crypto.randomBytes
的同步function。 我的疑问是,如果我这样做,我的节点程序将停止每次执行代码? 然后,我想如果有一个asynchronous函数列表,它们的运行时间很短,这些函数可以作为同步函数,那么使用这个函数列表进行开发将非常容易。
使用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();
请注意,这两个函数需要花费很多时间来执行,但不会互相阻塞。
使用以下命令与节点7.x一起运行:
node --harmony script-name.js
或与节点8.x与:
node script-name.js
我向你展示这些例子,以certificate它不是与callback地狱的asynchronousselect,并与漂亮的代码同步。 实际上,您可以使用新的async function
以非常优雅的方式运行asynchronous代码,并await
ES2017中提供的操作符 – 这是很好的解读,因为没有很多人知道这些function。
他们是asynchronous的,学会处理它。
现在承诺 ,未来ES2017的await
和async
将使您的生活更容易。
Bluebirds promisifyAll
在处理任何标准的Node.jscallbackAPI时非常有用。 它添加了使用Async
标记的函数,它返回一个promise,而不需要callback。
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))