2017-02-10 90 views
1

例如,我正在編寫一個隨機生成器,其中包含crypto.randomBytes(...)以及另一個異步函數。爲了避免回調地獄,儘管我可以使用crypto.randomBytes的同步功能。我的疑問是,如果我這樣做,我的節點程序將停止每次執行代碼?然後我想如果有一個異步函數列表,它們的運行時間非常短,這些函數可以作爲同步函數,然後用這個函數列表進行開發將非常簡單。哪些功能可以在node.js中同步工作?

+0

究竟是什麼問題? – jfriend00

回答

2

使用mz模塊,您可以讓crypto.randomBytes()返回承諾。 (使用--harmony標誌節點7.x中可用的),你可以使用它像這樣使用await

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 

我告訴你這些例子證明它不是異步的選擇與回調地獄,並與漂亮的代碼同步。實際上,您可以使用ES2017中提供的新0123B和await運營商以非常優雅的方式運行異步代碼 - 很好閱讀它,因爲沒有很多人知道這些功能。

0

他們是異步的,學會處理它。

Promises現在,未來ES2017的awaitasync將使您的生活變得更加輕鬆。

BluebirdspromisifyAll在處理任何標準的Node.js回調API時非常有用。它添加了標記爲Async的函數,它們返回一個承諾,而不需要回調。

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