2013-08-13 2 views
1

nodejs 또는 simliar 방식으로 사용할 수있는 간단한 pubsub 구현을 찾고 있습니다. 서버 쪽에서 만 필요하기 때문에 멋진 파일이 필요하지 않습니다.pubsub 디자인 패턴 for nodejs

모듈 A는

I (어쩌면 PARAMS가 전송되는 것을 제외) 모듈 A에 대해 아무것도 모른 채 'X' 모듈 B 이벤트 'X'를 구독 이벤트를 게시 :

나는 능력이 다음과 같은 갖고 싶어 이 간단한 구현을 테스트했습니다.

현재 간단한 pubsub 구현과 관련된 문제는 단순히 이벤트에 가입 할 수 없다는 것입니다.

모듈 A가 이벤트를 게시했지만 모듈 B가 필요하지 않은 경우 모듈 A에서 이벤트를받지 못합니다. 이벤트를 게시하기 전에 모듈 A가 모듈 B를 필요로하는 즉시 작동합니다. 그러나 이것은 다소 불쾌합니다.

짧은 형식으로 : nodejs와 잘 쌍을 이룬 디자인 패턴을 찾고 이벤트를 통해 통신 할 수있는 모듈을 매우 독립적으로 (루즈 커플 링) 작성할 수 있습니다. 다가오고있는 사람들이 당신에게 추천하고 있습니까?

나는 또한 eventemitter nodejs 보았지만 그것의 좋은 사용을 (어쩌면 난 그냥 그것을 볼 수없는 이유는 무엇입니까?) 찾을 수 없습니다

업데이트 : eventemitter에 더 조금 보면서 온 이 최대 :

emitter.js

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

module.exports = emitter; 

moduleA.js

var emitter = require('./emitter.js'); 
require('./moduleB.js'); // this shows off my problem 

emitter.emit('moduleA'); 

moduleB.js

var emitter = require('./emitter.js'); 

emitter.on('moduleA', function() { 
    console.log('reacted to event from moduleA'); 
}); 

이 내 "문제"로 표시하지만 나는 주위에 방법이 있는지 모르겠어요. 어쩌면 내 접근 방식은 완전히 잘못되었지만 브라우저 측에서는 모든 코드가 페이지로드에 미리로드되어 있기 때문에 작동해야합니다.

+0

귀하의 접근 방식은 작동해야하지만 당신이 그 코드를 moduleB.js''전에'moduleA.js'를로드하는 경우가 방출 할 수 B가 그것을 듣기 전에 이벤트. 그들의 주문 교환을 시도하십시오. – Bergi

+0

그게 바로 제가 현재보고있는 것입니다. 모듈 B가 모듈 A를 청취하지만 모듈 A가 이벤트를 방출하기 전에로드되지 않으면 단순히 이벤트를 포착하지 않습니다. 모듈은 어딘가에 필요하지 않으면 이벤트를 수신 할 수 없기 때문에 매우 논리적입니다.하지만 난 여전히 나쁘다고 생각하고 누군가가 모듈을 '미리로드하는'것을 쉽게 잊어 버릴 수있는 오류로 이어질 것입니다. – Playerwtf

+0

실제 유스 케이스에는 비동기 이벤트 만 포함됩니다. 즉 모듈이 실행될 때 아무 것도 실행되지 않습니다. 순서는 중요하지 않습니다. – Bergi

답변

4

기본 이벤트 배관을위한 간단한 템플릿은 노드의 코어 events 모듈을 사용합니다.

//modA.js 
var events = require('events'); 
var emitter = new events.EventEmitter; 

function funcA() { 
    console.log('[email protected] executing'); 
    emitter.emit('funcA'); 
} 

module.exports = { 
    funcA: funcA, 
    emitter: emitter 
}; 

//modB.js 
var events = require('events'); 
var emitter = new events.EventEmitter; 

function funcB() { 
    console.log('modB.funcB executing'); 
    emitter.emit('funcB'); 
} 

module.exports = { 
    funcB: funcB, 
    emitter: emitter 
}; 

//glue.js 
var modA = require('./modA'); 
var modB = require('./modB'); 
modA.emitter.on('funcA', modB.funcB); 
modA.funcA(); 

이 가
node glue.js 
[email protected] executing 
modB.funcB executing 
+0

... 그리고'modB.emitter.on ('funcB', modA.funcA); ' – Bergi

+0

@Bergi는 솔직히 ~ 선하다 싶지 않으면 안됩니다. Stackoverflow 오류. :-) –

+0

'EventEmitter'는 비동기 적이 아닙니까? – Bergi