2017-02-10 4 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(); 

そして、これら2つの関数は、実行するために多くの時間がかかりますが、彼らはお互いをブロックしないことに注意してください:より良いデモンストレーションのために

は、この例を考えてみましょう。私はそれが持つ非同期の選択ではないということを証明するためにあなたにこれらの例を示し

node script-name.js 

:と

node --harmony script-name.js 

またはノード8.xのとを:使用してノード7.xのと

実行してコールバック地獄と素晴らしいコードとの同期。実際には、新しいasync functionawaitオペレータのES2017を使用して、非常にエレガントな方法で非同期コードを実行することができます。多くの人がその機能について知っているわけではありません。

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)) 
関連する問題