이벤트의 비동기 기능

Nathan Knows

나는 성공하지 못한 마지막 날 동안 이것을 고치려고 노력해 왔습니다. 나는 노드 및 비동기 / 동기화 개념에 꽤 익숙하며 분명히 뭔가 빠졌습니다.

이벤트 내에서 하나씩 (비동기) 루프를 실행해야합니다. 이 루프는 데이터베이스와 상호 작용하며 완료하는 데 약간의 시간이 걸립니다. 이벤트 이미 터와 setImmediate ()로 최선을 다했지만 여전히 processMessage 및 storeMessage 함수가 동기화를 발생시킵니다. 이것을 봐주세요:

const EventEmitter  = require('events')
const emitter = new EventEmitter()

msg.once('body', stream => {
    emitter.on('done',() => {
        try {
            setImmediate(async ()=>{  // <-- Here I'm trying to queue async the funtion
                await emailService.processMessage(stream);
            })
        } catch(err) {
            helper.logger.error('Problem stockpiling mails to be processed');
        }
    });
});

그런 다음 메시지가 끝나면 이것을 호출합니다.

f.once('end', function() {
    emitter.emit('done');
});

문제가 setImmediate에서 호출하는 함수 내부에 있는지 알 수 없으므로 아래에 두겠습니다.

exports.processMessage = async (stream) => {
    /// ...
    await storeMessage(parsed);
    /// ...
}

async function storeMessage (parsed){
    // Some async database interaction
}
조나스 윌 름스

비동기 함수는에 도달 할 때까지 실행 된 await다음 중지되고 다른 함수가 실행될 수 있습니다. 따라서 비동기 함수를 두 번 호출하면 "병렬로"실행됩니다.

async function task(id) {
  console.log("before " + id);
  await undefined;
  console.log("after " + id);
}

task(1);
task(2);

이제 일반적인 솔루션은 await하나의 비동기 함수에서 서로 다른 작업을 수행하여 서로 실행되도록하는 것입니다.

 await task(1);
 await task(2);

안타깝게도 귀하의 경우 emitter.on('done',() => {작업이 실행되는 동안에도 여러 번 트리거 될 수 있으므로 ² 작업이 쉽지 않습니다. 따라서 여러 콜백에서 비동기 함수를 연결하려면 promise를 사용해야합니다.

 let done = Promise.resolve();

 emitter.on('done',() => {
   done = done.then(async function() {
      // ...
   });
  });

² 내가 볼 수있는 한. 하지만 사용 사례에 대한 더 우아한 솔루션이있을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

비동기 대 동기화 이벤트 처리기 성능

분류에서Dev

Xamarin의 비동기 단추 이벤트

분류에서Dev

camel-cdi의 비동기 이벤트

분류에서Dev

onclick 이벤트의 에코 기능

분류에서Dev

비동기 / 대기 이벤트

분류에서Dev

비동기로 oncomplete 이벤트 실행

분류에서Dev

루프-비동기 이벤트 사용

분류에서Dev

수용체 실행의 이벤트 버스 및 비동기

분류에서Dev

이벤트 콜백 내부의 비동기 작업

분류에서Dev

이벤트 기반 비동기 WCF 서비스 호출의 예외 처리

분류에서Dev

이벤트 핸들러, 이벤트 큐 및 비동기 동작

분류에서Dev

Symfony 4의 기능 테스트 이벤트 및 구독자

분류에서Dev

Node.js의 이벤트 핸들러 내부에서 비동기 대기

분류에서Dev

비동기 닫기 이벤트에 대한 프록시의 응답

분류에서Dev

비동기 닫기 이벤트에 대한 프록시의 응답

분류에서Dev

하나의 PHP 파일에 두 개의 이벤트 기능

분류에서Dev

반응 기능 구성 요소의 비동기 / 대기

분류에서Dev

Nodeunit 테스트 이벤트 기반 비동기 코드

분류에서Dev

Dart / Flutter : Isolate의 최상위 기능의 비동기 동작

분류에서Dev

JQuery의 unclick 이벤트 기능은 무엇입니까

분류에서Dev

Magento 2의 모달 기능에서 이벤트 차단

분류에서Dev

jquery의 클릭 기능 후 2 이벤트

분류에서Dev

2 개의 기능을 동시에 개별적으로 변경 이벤트

분류에서Dev

요소의 이벤트 핸들러에서 작동하지 않는 기능

분류에서Dev

JS 성능 : 조건 내부의 이벤트 처리기와 이벤트 처리기 내부의 조건

분류에서Dev

여러 이벤트 처리기에 대한 C # 비동기 이벤트

분류에서Dev

Nodejs에서 비동기 콜백 이벤트를 쌓는 최적의 방법

분류에서Dev

이벤트로 백본 기능 구현

분류에서Dev

이벤트에 기능 할당

Related 관련 기사

  1. 1

    비동기 대 동기화 이벤트 처리기 성능

  2. 2

    Xamarin의 비동기 단추 이벤트

  3. 3

    camel-cdi의 비동기 이벤트

  4. 4

    onclick 이벤트의 에코 기능

  5. 5

    비동기 / 대기 이벤트

  6. 6

    비동기로 oncomplete 이벤트 실행

  7. 7

    루프-비동기 이벤트 사용

  8. 8

    수용체 실행의 이벤트 버스 및 비동기

  9. 9

    이벤트 콜백 내부의 비동기 작업

  10. 10

    이벤트 기반 비동기 WCF 서비스 호출의 예외 처리

  11. 11

    이벤트 핸들러, 이벤트 큐 및 비동기 동작

  12. 12

    Symfony 4의 기능 테스트 이벤트 및 구독자

  13. 13

    Node.js의 이벤트 핸들러 내부에서 비동기 대기

  14. 14

    비동기 닫기 이벤트에 대한 프록시의 응답

  15. 15

    비동기 닫기 이벤트에 대한 프록시의 응답

  16. 16

    하나의 PHP 파일에 두 개의 이벤트 기능

  17. 17

    반응 기능 구성 요소의 비동기 / 대기

  18. 18

    Nodeunit 테스트 이벤트 기반 비동기 코드

  19. 19

    Dart / Flutter : Isolate의 최상위 기능의 비동기 동작

  20. 20

    JQuery의 unclick 이벤트 기능은 무엇입니까

  21. 21

    Magento 2의 모달 기능에서 이벤트 차단

  22. 22

    jquery의 클릭 기능 후 2 이벤트

  23. 23

    2 개의 기능을 동시에 개별적으로 변경 이벤트

  24. 24

    요소의 이벤트 핸들러에서 작동하지 않는 기능

  25. 25

    JS 성능 : 조건 내부의 이벤트 처리기와 이벤트 처리기 내부의 조건

  26. 26

    여러 이벤트 처리기에 대한 C # 비동기 이벤트

  27. 27

    Nodejs에서 비동기 콜백 이벤트를 쌓는 최적의 방법

  28. 28

    이벤트로 백본 기능 구현

  29. 29

    이벤트에 기능 할당

뜨겁다태그

보관