所有异步处理程序完成后执行javascript函数

时间:2014-03-29 12:56:33

标签: javascript node.js events asynchronous

例如,在SIGINT处理程序中,我需要等到所有子进程完成。但是孩子的“关闭”事件可能会有处理程序,它们本身可能会执行外部通知等异步操作。

所以我需要等到

  1. child.closed和
  2. child.closed处理程序已完成并
  3. 在child.closed处理程序中启动的异步操作全部完成。
  4. 下面简化了仅知道第二个检查点的当前代码。

    var child_process = require('child_process');
    var events = require('events');
    var timers = require('timers');
    
    var childRunning = false;   // has child flag (counter in actual app)
    
    // starting child
    var child = child_process.spawn(process.cwd()+'/stub.js',{detached:true});
    childRunning = true;
    child.on('close',function(){childRunning=false});   //
    
    // example close handler with async action inside
    // actually there is a bunch of such handlers
    child.on('close',function(){
        console.log('child close handler triggered');
        timers.setTimeout(function(){
            console.log('close handler async action completed')
        }, 2000);
    });
    
    process.on('SIGINT',function(){
        console.log("Received SIGINT");
        closeApp=function(){
            console.log("readyToExit");
            process.exit();
        }
        if (!childRunning) closeApp();
        // in fact, i need here not this event, but 
        //   'all close handlers are done their job'
        child.once('close',closeApp);
    })
    // actually there is a daemon app, so it does not stop by itself at all
    

    在此示例中,通常您会看到“关闭处理程序异步操作已完成”消息,但如果按ctrl + c,则该消息将被丢失。所以我需要以某种方式将其重写为se

    我正在努力寻找一种解决方案,让关闭处理程序尽可能简单。 我不知道如何命名这个案例,所以谷歌搜索没有帮助。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用一些扩展的EventEmitter

  1. 可以处理由事件监听器返回的承诺
  2. 实施Q.all() - 收集承诺的行为
  3. 在所有侦听器上完成另一个事件(包括等待承诺)
  4. 我会尝试在npm注册表中找到这样的内容,或者如果没有找到,我会自己实现。