Node.js 如何在事件处理程序中实现异步/等待?

Node.js 如何在事件处理程序中实现异步/等待?,node.js,es6-promise,eventemitter,Node.js,Es6 Promise,Eventemitter,我无法在事件处理程序中实现wait。出于某种原因,事件处理程序不会等到第一个进程完成后再启动新进程。为什么这种奇怪的行为会如此 const{EventEmitter}=require(“事件”); 让alreadyRunning=false; const-sampleEventHandler=new-EventEmitter(); sampleEventHandler.on(“数据”,异步(消息)=>{ 等待重进程(消息); }); 异步函数重进程(消息){ 日志(“新消息:”,消息); lo

我无法在事件处理程序中实现wait。出于某种原因,事件处理程序不会等到第一个进程完成后再启动新进程。为什么这种奇怪的行为会如此

const{EventEmitter}=require(“事件”);
让alreadyRunning=false;
const-sampleEventHandler=new-EventEmitter();
sampleEventHandler.on(“数据”,异步(消息)=>{
等待重进程(消息);
});
异步函数重进程(消息){
日志(“新消息:”,消息);
log(“已在运行?:”,alreadyRunning);
如果(已运行){
log(“为什么在进入这里之前不等待第一个任务完全完成?”);
}
const rand=Math.random()*1000;
//在这里设置变量
alreadyRunning=true;
等待睡眠(兰德);
//在这里安顿
alreadyRunning=false;
}
功能睡眠(ms){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
//发射事件5次
for(设i=0;i<5;i++){
sampleEventHandler.emit(“数据”,i);
}
编辑: 之所以没有放弃它,是因为您只执行了
console.log
。在它下面添加一个报税表

async function heavyProcess(message) {
  console.log("New message: ", message);
  console.log("already running?: ", alreadyRunning);
  if (alreadyRunning) {
    console.log("Why doesn't it await for first task to complete fully before entering here?");
     return // Actually stop executing
  }

  const rand = Math.random() * 1000;
  // set var here
  alreadyRunning = true;
  await sleep(rand);
  // unset here
  alreadyRunning = false;
}
编辑2: 注释如下:OP所需的行为是heavyProcess只能发生一次,并且只有在流程完成后才开始新的流程

每个事件现在都在启动一个新的heavyProcess,因为Wait只是等待结果,而不是阻塞

您必须在事件中介绍阻塞(或者使用RXJS exhaustMap或类似的工具)


要成功使用wait,您需要promisify
heavyProcess
函数:

function heavyProcess(message) {
    return new Promise( async (resolve, reject) => {
        console.log("New message: ", message);
        console.log("already running?: ", alreadyRunning);
        if (alreadyRunning) {
            console.log("Why doesn't it await for first task to complete fully before entering here?");
        }

        const rand = Math.random() * 1000;
        // set var here
        alreadyRunning = true;
        await sleep(rand);
        // unset here
        alreadyRunning = false;
        resolve('Done');
    });
}

您是否暗示任务在事件处理程序中并行执行?是的,每个事件都将执行该函数,该函数将触发heavyProcess。这也应该反映在日志中。(新的消息日志将连续弹出5次)My Qn是为什么当一个新任务已经在处理中时会触发一个新任务?为什么不等一下?我写的代码只是一个复制我在其他地方面临的行为的示例。这就是JavaScript的异步特性。
wait
关键字表示您暂停函数的执行,直到您从正在等待的函数获得响应为止。在您的示例中,每个事件都会发生这种情况。你在等待一个新的重进程完成。它不能等待。发射循环不等待。它同步调用每个侦听器,然后丢弃结果。如果你想要一个等待的发射循环,就像它有一个内置的承诺一样。总之,获取eventemitter模块的源代码并编写一个这样的。为什么这个问题没有500万个喜欢?我正在尝试流式传输一个S3文件并启动一个异步调用,以将其保存到DB以获得一个块,但不,我们不能这样做。。。
function heavyProcess(message) {
    return new Promise( async (resolve, reject) => {
        console.log("New message: ", message);
        console.log("already running?: ", alreadyRunning);
        if (alreadyRunning) {
            console.log("Why doesn't it await for first task to complete fully before entering here?");
        }

        const rand = Math.random() * 1000;
        // set var here
        alreadyRunning = true;
        await sleep(rand);
        // unset here
        alreadyRunning = false;
        resolve('Done');
    });
}