나는 성공하지 못한 마지막 날 동안 이것을 고치려고 노력해 왔습니다. 나는 노드 및 비동기 / 동기화 개념에 꽤 익숙하며 분명히 뭔가 빠졌습니다.
이벤트 내에서 하나씩 (비동기) 루프를 실행해야합니다. 이 루프는 데이터베이스와 상호 작용하며 완료하는 데 약간의 시간이 걸립니다. 이벤트 이미 터와 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] 삭제
몇 마디 만하겠습니다