2016-11-05 5 views
0

얼마 전 node.js에서 개발하기 시작했습니다. 최근에 노드의 'event loop'및 비동기 메커니즘에 deepdive을 입력했습니다. 그러나 아직도 나는 sync and async callbacks 사이의 다른 것을 완전히 이해하지 못합니다.Node.js : 비동기 콜백 vs sync 콜백 vs process.nextTick vs setTimeout

이 예제에서는 node.js API에서 어떤 함수가 먼저 호출되는지 명확하지 않은 이유를 알았습니다.

maybeSync(true,() => { 
    foo(); 
}); 
bar(); 

그러나, 우리는이 있다면 :

그것은 그들이 항상 동기화 순서대로 실행 왜 나에게 분명하지 않다
syncOrAsync(arg,() => { 
if (arg) { 
    cb(arg); 
    return; 
} 
}); 

syncOrAsync(true, function(result) { 
    console.log('result'); 
}); 

console.log('after result); 

, 나는 후 이벤트 루프 에 의해 실행해야 콜백 함수를 했더라도 스택이 비어 있습니다 (console.log ('after result')가 완료되었습니다). 비동기를 사용하려면 항상 process.nextTick(cb);을 추가해야합니까? 그리고 process.nextTick과 setTimeout();의 차이점은 무엇입니까?

+1

타이머 나 외부 호출과 같이 실제로 비동기식 인 것이 없으면 코드는 항상 동기식입니다. 모든 자바 스크립트 코드의 기본 상태이므로 콜백을 추가해도 비동기가되지는 않습니다. – adeneo

+0

그래서 항상'process.nextTick()'을 추가해야합니까? – wizard

+0

아니요, 비동기식을 추가해야합니다. – adeneo

답변

3

타이머 나 외부 호출 등과 같이 실제로는 비동기식 인 경우가 아니면 코드가 항상 동기식입니다. 모든 자바 스크립트 코드의 기본 상태입니다.
는 콜백을 추가하면 다음

는 비동기하지 않는 것은 비동기 코드의 예 정말 기능이 비동기하지 않습니다 process.nextTick()를 사용

function syncOrAsync(sync, cb) { 
 
    if (sync) { 
 
     return cb(); 
 
    } else { 
 
     setTimeout(cb, 100); // async, waits 0.1 seconds to call callback 
 
    } 
 
} 
 

 
syncOrAsync(true, function(result) { // synchronous call 
 
    console.log('result 1'); // happens first 
 
}); 
 

 
syncOrAsync(false, function(result) { // asynchronous call 
 
    console.log('result 2'); // happens last, as it's async 
 
}); 
 

 

 
console.log('result 3');  // happens second


하지만, 다소 동일 함

function syncOrAsync() { 
    console.log('result 1'); // this happens last 
} 

process.nextTick(syncOrAsync); 

console.log('result 2'); // this happens first 

이것은 이벤트 루프 주변의 다음 패스까지 syncOrAsync의 실행을 연기하므로 많은 방법으로 setTimeout(syncOrAsync)과 같지만 함수는 여전히 비동기 적이 지 않으며 콜백이 즉시 실행됩니다. 함수의 전체 실행을 지연시키기 만하면됩니다.

+0

그래서, 당신이 이해하면 이해합니다. node.js의 비동기의 진정한 힘은 데이터베이스, 파일 읽기, 링크 요청 등등과 같은 리소스를 처리 할 때 작용합니다. 많은 I/O 작업을 수행합니다. 다른 것들은'process.nextTick();'또는'setTimeout (cb); ' – wizard

+1

예, 자바 스크립트는 동기식이며 단일 스레드입니다. 모든 것은 작성된 순서대로 이루어집니다. 비동기 코드는 대부분 비동기 함수를 기반으로합니다. 브라우저에서는 Ajax, 타이머 등이며, Node에서는 OS 호출, 데이터베이스 조회 및 이와 유사한 작업을 수행합니다. – adeneo