2012-05-29 2 views
1

나는 최근 node.js.로 시작했습니다. 이것은 node.js 비동기 동작이 세 가지 방법으로 사용될 수 있다고 말합니다. events, stream, callback. process.nextTick() 사용하지 않는 것이 이 함수의 반환하기 전에을 실행으로node.js 콜백은 어떻게 비동기식입니까?

이벤트 및 emit,pipe 이벤트가 진정으로 비동기 그것을 만들기에 스트림 작동하지만 방법은, 콜백 비동기입니다.

이벤트 :

event.on('data',function(data){ 

}); 

콜백 :

function(data,cb){ 
// do something with "data" 
cb(); 
return; 
} 

답변

1

의 콜백이 함수에 대해 자세히 살펴 보자 : 당신은 여기이 큰 오류가

function(data, cb) { 
// do something with "data" 
cb(); 
return; 
} 

을 :

1) 콜백 기능이있는 경우 수익을 사용할 이유가 없습니다. 반환은 즉시 응답을 보내는 동기 작업이있는 경우에만 사용됩니다 (나중에 언젠가 콜백이 트리거 될 때까지 기다릴 필요가 없음).

2) 콜백을 즉시 실행하지 마십시오. 아무런 의미가 없습니다. 콜백을 사용하지 않고 return 문을 사용하거나 (실제로 비동기 함수가없는 경우) 또는 결과를 얻은 후에 언젠가 콜백을 실행할 수 있습니다.

더 나은 예 :

function foo(data, callback) { 
    // do something with the data 
    callback(); 
} 

function bar() { 
    // this will be called as a callback from foo() 
} 

setInterval(function() { foo(data, bar) }, 1000); 
console.log('this is displayed immediately'); 

당신에게 :이 경우

function (data, cb) { 
    // you make an Ajax call and 
    // you don't know when the callback will be triggered 
    makeAjaxCall(data, cb); 
} 
+0

당신은 매우 합리적으로 비동기 동작, 예를 들어 뭔가를 반환 할 수 있습니다 메소드 연결을 허용하는'this'를 반환 할 수 있습니다. – lanzz

+0

@lanzz : 레이스 컨디션을위한 훌륭한 레서피처럼 들립니다. –

+0

@MichaelBorgwardt 필자는 이벤트 중심의 단일 스레드 코드에서 경쟁 조건을 야기하는 것이 매우 바람직하다고 생각합니다. 또한,'object.method1(). method2()'는'object.method1();보다 경합 조건에 더 취약하다. object.method2()'? – lanzz

0

는 콜백 함수는 그러나 이러한 기능은 비동기 적으로 사용할 수있는 경우는 아직 없습니다, 비동기 적으로 실행되지 않는 매초마다 foo()이 실행될 예정이며 비동기 적으로 발생합니다. 하지만 콜백이 존재하므로 foo() 함수 외부에서 추가 동작을 설정할 수 있습니다. foo()이 다른 콜백으로 호출되어 다른 응용 프로그램 논리를 발생시키는 여러 가지 경우를 설정할 수 있습니다.

1

그 콜백이 반드시 비동기 입출력을 의미하는 것은 아닙니다.

var EventEmitter = require('events').EventEmitter; 

var emitter = new EventEmitter(); 

emitter.on('ev', function(x) { 
    console.log("received event ", x); 
}); 

console.log("Hello"); 
emitter.emit('ev', "X"); 
console.log("World"); 

결과 :

이벤트 EventEmitter의 .emit이 아닌 다음 틱에 즉시 작동한다는 의미에서, 필연적으로 비동기 아니다 그러나

Hello 
received event X 
World 

, 콜백 다음에 의해 "비동기"로 작성됩니다.

  • process.nextTick() 사용. 이 함수는 콜백 비동기 내부에서 실제 I/O 연산을 수행하지 않습니다. 다음 진드기 때까지 실행을 연기합니다. 일부 작업이 차단되면이 틱 대신 다음 틱에서 이벤트 루프도 차단됩니다.비동기 것으로 알려진 다른 콜백 - 기반 기능을 이용하여 비동기 I/O 동작

    function(data, cb) { 
        emitter.startIO(); 
        emitter.on('someIOEvent', function(e) { 
         doSomethingWith(data,e); 
         cb(); 
        }); 
    }); 
    
  • 의해 유발되는 것으로 알려져있다 이벤트에서 지정된 콜백 함수를 호출

    function(data, cb) { 
        process.nextTick(function() { doSomethingWith(data); cb(); }) 
    }); 
    
  • . 노드 코어 및 노드 모듈의 대부분 기능은 다음과 같습니다.

    function(data, cb) { 
        otherFunction(data, function(moredata) { 
         doMoreStuffWith(moredata, data); cb(); 
        }); 
    }); 
    
관련 문제