Nodejs 에서 메 일의 동기 화 읽 기 2 실현

2742 단어
이전 글 에 서 는 Nodejs 에서 메 일의 동기 화 읽 기 [1] 를 어떻게 실현 하 는 지 소개 하 였 으 며, imap 를 바탕 으로 라 이브 러 리 와 의 방법 을 wrap 로 포장 하여 동기 화 행 을 실현 하 였 다.그러나 코드 의 실현 을 보면 여전히 두 가지 문제 가 존재 한다.우선 연결 을 동기 화하 여 닫 는 방법 은 메 일 을 읽 는 '짝 짓 기 사용' 이 어야 합 니 다.그 다음으로 메 일 을 읽 는 방법 을 여러 번 호출 하면 emitter MaxListeners error 를 일 으 킬 수 있 습 니 다.
첫 번 째 문제 에 대해 imap 연결 을 끝 내 는 방법 을 수정 하여 메 일 읽 기와 해석 이 끝 난 후에 실행 할 수 있 습 니 다. 즉, 리 셋 함수 로 promise 체인 을 넣 는 것 입 니 다.
async function endAsync(message = null) {    return new Promise(function (resolve, nay) {        imap.on('end', function () {            resolve(message);        });        imap.end();    });}

…
).then(function (messages) {    return endAsync(messages[messages.length - 1]);}).then(function (message) {    return message;})    .catch(function (error) {        console.error("Oops:", error.message);        imap.end();    })

두 번 째 문제 에 대한 잘못된 정 보 는:
(node:3133) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit


nodejs 의 공식 문서 에서 해당 하 는 설명 을 찾 을 수 있 습 니 다.
By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks.
기본적으로 같은 이벤트 에 10 개가 넘 는 listener 를 추가 하면 경고 메 시 지 를 출력 합 니 다.이 기본 행 위 는 메모리 누 출 을 발견 하 는 데 도움 이 된다.
이전 글 [2] 에서 말 한 자바 script 에서 자바 script runtime 은 세 번 째 메모리 공간, 이벤트 큐 (Queue) 를 유지 하고 있 기 때문에 이벤트 의 listener 를 메모리 관리의 범주 에 고려 해 야 합 니 다.그러나 허용 되 는 listener 수 를 늘 려 이 문 제 를 회피 하고 싶 지 않다. 더 좋 은 방법 이 있 기 때문이다.
Using the eventEmitter.once() method, it is possible to register a listener that is called at most once for a particular event. Once the event is emitted, the listener is unregistered and then called.
once 로 listener 를 등록 할 때 특정한 이벤트 에 한 번 만 호출 됩 니 다. 이벤트 가 발생 하면 listener 도 트리거 되 지만 나중에 삭 제 됩 니 다.
async function endAsync(message = null) {    return new Promise(function (resolve, nay) {        imap.once('end', function () {            resolve(message);        });        imap.end();    });}

이 두 가지 문 제 를 해결 한 후에 이 간단 한 예 를 돌 이 켜 보면 imap 대상 이 전체 변수 이거 나 singleton 모델 의 응용 이 라 고 할 수 있 기 때문에 setMaxListeners 의 문제 가 생 긴 다.
const imap = new Imap({    user: 'user',    password: 'password',    port: 993,    host: 'host',    tls: true});

이 두 편의 글 을 통 해 독자 들 은 내 가 Nodejs 에서 메 일의 동기 화 읽 기 를 어떻게 실현 하 는 지 알 수 있 을 것 이다.그리고 이 과정 에서 나타 난 문제 와 해당 하 는 해결 방법 을 묘사 했다.
인 스 턴 스 코드 는 github 에서 [3] 을 찾 을 수 있 습 니 다.
【 1 】 Nodejs 에서 메 일의 동기 화 읽 기 1 【 2 】 Nodejs Event Loop 【 3 】 testimap_sample_end_once.js

좋은 웹페이지 즐겨찾기