2017-02-10 1 views
1

예를 들어 crypto.randomBytes(...)과 함께 임의의 생성기를 작성하면서 다른 비동기 함수를 작성하고 있습니다. 콜백 지옥에있는 가을을 피하기 위하여, 나는 crypto.randomBytes의 sync 기능을 사용할 수 있더라도. 내 코드가 실행될 때마다 노드 프로그램이 멈추는 지 의심 스럽습니다. 그런 다음 비동기 함수 목록이 있으면 실행 시간이 매우 짧으며 동기 함수로 작동 할 수 있다고 생각하고이 함수 목록으로 개발하는 것이 쉬울 것입니다.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 

내가 그것을 비동기의 선택은하지의 것을 입증하는 당신에게 그 예를 보여 콜백 지옥과 좋은 코드와 동기화. 실제로는 async functionawait 연산자를 ES2017으로 사용할 수있는 매우 우아한 방식으로 비동기 코드를 실행할 수 있습니다. 많은 사람들이 이러한 기능에 대해 알지 못하기 때문에 그것에 대해 읽는 것이 좋습니다.

0

비동기식이므로 다루는 법을 배웁니다.

Promises 지금은 앞으로, 그리고 ES2017의 awaitasync은 훨씬 쉬워 질 것입니다.

Bluebirds 은 표준 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)) 
관련 문제