哪些函数可以在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的awaitasync将使您的生活更容易。

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