node.js 초보자라면 이벤트보다 콜백을 사용하면 어떤 이점이 있습니까?


24

저는 초보자 JavaScripter이며 V8 엔진 내부에서 진행되는 작업에 대한 실제 지식이 없습니다.

말했듯이, 실제로 node.js 환경에 대한 초기 단계를 즐기고 있지만 글로벌 이벤트를 생성하는 수단으로 events.EventEmitter ()를 지속적으로 사용하고 있다는 것을 알았습니다. Objective-C 또는 Python 프로그램에서 쓰는 것과 비슷한 패턴입니다.

나는 항상 다음과 같은 일을하고 있습니다.

var events = require('events');

var eventCenter = new events.EventEmitter();

eventCenter.on('init', function() {
    var greeting = 'Hello World!';
    console.log('We're in the init function!);
    eventCenter.emit('secondFunction', greeting);
});

eventCenter.on('secondFunction', function(greeting) {
        console.log('We're in the second function!);
        console.log(greeting);
    eventCenter.emit('nextFunction');
});

eventCenter.on('nextFunction', function {
    /* do stuff */
});

eventCenter.emit('init');

따라서 실제로 'async'node.js 코드를 원하는 순서대로 수행하는 코드로 구성하는 대신 "역방향으로 코딩"하는 것이 좋습니다. 콜백이 많은 방식으로 성능 측면에서나 철학 측면에서이를 수행하는 데 차이가 있습니까? 이벤트 대신 콜백을 사용하여 동일한 작업을 수행하는 것이 더 낫습니까?


콜백을 많이 사용하여 코드 가독성에 문제가있는 경우 프레임 워크를 사용하여 콜백 사용을 줄이십시오. 약간의 조정이 필요하지만 약속은 종종 추악한 콜백을 풀 수 있습니다. JQuery를 사용하는 경우 Deferred를 사용할 수 있습니다 . 가장 간단한 약속 프레임 워크 중 하나는 RSVP 입니다.
브라이언

혼란 스럽습니다. 코드에 아무것도 비동기식으로 표시되지 않고 지나치게 복잡한 방식으로 작성된 함수 호출 만 있습니다.
svick

답변:


27

콜백의 좋은 점은 전역 상태가 없으며 매개 변수를 전달하는 것이 쉽지 않다는 것입니다. 함수가 있다면, download(URL, callback: (FileData)->void)그 함수가 본질적으로 "이것을 잡아라"함수를 구성 할 수있는 독립적 인 고차 함수라는 것을 알 수 있습니다. 다른 사람도 해당 콜백을 처리 할 수 ​​없으며 해당 콜백은 부모 함수에 지정된 매개 변수 외에는 아무것도 알지 못하므로 코드 흐름이 정확히 예상 한 것입니다. 따라서 모듈 식이고 테스트하기 쉽습니다.

이제 5 개의 파일을 병렬로 다운로드하고 다른 작업을 수행하려면 적절한 콜백 함수를 사용하여이 기능 중 5 개만 해제하면됩니다. 익명 함수 구문이 좋은 언어에서는 매우 강력 할 수 있습니다.

반면에 이벤트는 1..*상태 변경을 사용자 에게 알리기 위해 더 설계되었습니다 . 의 끝에서 "다운로드 완료"이벤트 download(URL)를 시작 processDownload()하여 데이터를 찾을 수있는 위치를 알려주는 경우, 구현 구현을 더 많은 상태로 묶는 것입니다. 지금 다운로드를 어떻게 병렬화합니까? 다른 다운로드를 어떻게 다르게 처리합니까? 가 download(URL, eventId)우아한? 가 downloadAndDoThing(URL)우아한? 거의.

물론, 모든 것과 마찬가지로, 당신은 절충을하고 있습니다. 중첩 된 콜백은 코드 실행 순서를 더 혼란스럽게 만들 수 있으며, 쉽게 액세스 할 수 없기 때문에 생산자와 소비자 사이 에 관계 가있는 모든 항목에는 적합 하지 않습니다1..* . 데이터를 전달하는 데 어려움이 있지만 추가 상태가없는 상태에서 벗어날 수 있다면 일반적으로 이점입니다.

어쨌든 콜백이 관용적이고 언어와 라이브러리가 사용되도록 설계된 node.js로 코딩하고 있습니다. 어떤 디자인이든 다른 디자인이든 장점이 있더라도 관용구를 피하려고 시도하는 것보다 어떤 언어로든 관용어 코드를 작성하는 것이 훨씬 더 큰 도움이되고 인생이 훨씬 쉬워 질 것입니다.


2

NodeJS에서 이벤트를 사용한 적이 없지만 일반적으로 클라이언트 쪽 JS 이벤트를 사용하는 것은 AppointmentBookedEvent와 같은 일이 발생했음을 알리는 것입니다. 패널 등).
그러나 이벤트를 사용하여 방법이 완료되었다는 신호는 여행하기에 위험한 길일 수 있습니다. 이벤트가 발생했을 때와 동일한 순서로 이벤트에 의존 할 수 없으므로 모든 종류의 임의성이 발생할 수 있습니다.
이벤트를 사용하는 데 아무런 문제가 없지만 특정 수준의 세분성이 없어서는 안됩니다. ; 도메인 이벤트를 고수한다면 괜찮습니다. 그러나 방법이 완료되었음을 알리는 것은 너무 세밀합니다.


0

당신이 탐험 할 수있는 것은 이벤트를 방출하는 객체 외부의 이벤트 사용입니다. 귀하의 예에서 eventCenter자체 이벤트를 생성하고 처리하는 것으로 보입니다. 다른 객체가 이벤트를 처리하기 시작하면 응용 프로그램의 구조가 어떻게 변경 될 수 있는지 고려하십시오.

따라서 eventCenter다른 객체가 시작 코드 등을 처리 할 수있는 "init"를 방출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.