2017-03-11 2 views
0

someevent 이벤트가 시작되면 계속하기 전에 약속이 해결되기를 기다리기 만하면됩니다. 그러나 slowFunctionThatReturnsPromise는 해결하는 데 오랜 시간이 걸리고 전체 프로세스는 해결되기 전에 종료됩니다. 그러므로 결코 완료되지 않습니다. 나는 then을 사용하여 해결할 약속을 기다릴 것이라고 생각했지만, 왜 기다리지 않는지는 알 수 없습니다. 당신은 Node.js를 "종료"이벤트에 그것을 할 수 없습니다emitter.on 리스너 함수 내에서 해결 될 때까지 기다리십시오.

emitter.on('someevent', listener) 


var listener = function() 
{ 
    x.slowFunctionThatReturnsPromise() 
     .then(function() 
     { 
      console.log('done'); 
     }) 
} 
+0

* Waiting * 및 * asynchronous *는 서로 반대입니다. * 동기식 * 코드는 동일한 호출 스택의 다른 코드를 계속 사용하기 전에 프로세스를 계속 사용 중 상태로 유지하지만 * asynchronous * 코드는 현재 실행중인 호출 스택이 완료된 후에 만 ​​호출됩니다. – trincot

+0

'listenF '함수를 종료하기 전에'slowFunctionThatReturnsPromise'에 의해 반환 된 약속이 필요합니다. – jmccure

+1

'then' 콜백은 비동기 적으로 실행되기 때문에 리턴하기 전에 콜백이 실행되지 않습니다. 약속이지만, 현재 코드 작업이 완료된 후에. 그래서 : 불가능합니다. – trincot

답변

1

리스너 함수는 동기 작업을 수행해야합니다 설명합니다. Node.js 프로세스는 'exit'이벤트를 호출 한 직후 종료됩니다. 청취자는 이벤트 루프 에 대기중인 추가 작업을 중단합니다. 다음 예에서, 예를 들어, 타임 아웃 가 발생하지 않습니다 :

https://nodejs.org/dist/latest-v7.x/docs/api/process.html#process_event_exit

당신은 비록 당신이 준비가되면 프로세스를 종료 한 후 우아한 죽일 신호를 처리 할 수 ​​있습니다.

process.on('SIGINT',() => { 
    x.slowFunctionThatReturnsPromise().then(function() { 
     process.exit(0); 
    }) 
}); 
+0

사과, 나 (나쁜) 예를 들어 출구를 사용했다, 이벤트 이름이 실제로 뭔가 다른 것입니다 – jmccure

+1

좋아. 이 경우 표준 EventEmitter의 리스너가 동기 적이기 때문에이 작업을 수행 할 수 없습니다. 이 이벤트 이미 터가 더 나을 수도 있습니다. https://www.npmjs.com/package/async-eventemitter – wookieb

+0

링크를 이용해 주셔서 감사합니다.하지만 불행히도 내가 겪고있는 이벤트 이미 터는 mocha 내에 있으며, mocha https를 수정하고 싶지 않습니다. //www.npmjs.com/package/mocha – jmccure

0

당신은 x.slowFunctionThatReturnsPromise() 앞에 return 누락?

+0

예, 노드'EventEmitter'는 리스너가 반환하는 것을 신경 쓰지 않으므로 동작에 영향을 미치지 않습니다. – Bergi