Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中创建等待事件的异步函数?_Javascript_Node.js - Fatal编程技术网

如何在Javascript中创建等待事件的异步函数?

如何在Javascript中创建等待事件的异步函数?,javascript,node.js,Javascript,Node.js,如何阻止该活动 const EventEmitter = require('events').EventEmitter; const util = require('util'); function Task() { EventEmitter.call(this); this.setMaxListeners(Infinity); this.dosomething = () => { console.log("do something"); };

如何阻止该活动

const EventEmitter = require('events').EventEmitter;
const util = require('util');

function Task() {
    EventEmitter.call(this);
    this.setMaxListeners(Infinity);

    this.dosomething = () => {
    console.log("do something");
    };

    this.run = (iter) => {
    for(i = 0; i < iter; i++) {
            this.dosomething();
        this.emit('someevent');
    }
    }

}

util.inherits(Task, EventEmitter);

task = new Task();

function do_work() {
    console.log("work 1");
    task.once('someevent', (props) => {
    console.log('event happened');
    });
    console.log("work 2");
}

do_work();
task.run(5);
const EventEmitter=require('events')。EventEmitter;
const util=require('util');
功能任务(){
EventEmitter.call(this);
this.setMaxListeners(无穷大);
this.dosomething=()=>{
log(“做某事”);
};
this.run=(iter)=>{
对于(i=0;i{
log(“事件发生”);
});
控制台日志(“工作2”);
}
你工作吗;
任务。运行(5);
实际结果
工作1
工作2
做点什么
事件发生
做点什么
做点什么
做点什么
做点什么

预期结果
工作1
做点什么
事件发生
工作2
做点什么
做点什么
做点什么

如果我正确理解了您的问题,那么可以通过包装
任务
事件处理程序的
承诺
来实现:

async function do_work() {

  console.log("work 1");

  // use a promise to block completion of do_work() function
  // until task event callback has been invoked
  await (new Promise(resolve => {

    task.once('someevent', (props) => {

      console.log('event happened');

      // Now that task callback has been invoked, "resolve" the
      // enclosing promise to allow do_work()'s execution to complete
      resolve();

    });
  }));

  console.log("work 2");
}
上面代码中的想法是包装任务
someevent
处理程序,以便在触发事件处理程序后可以调用promise
resolve
(即通过调用
resolve()
)。这允许继续调用
do_work()
,以实现所需的执行行为

此外,您还需要执行以下操作:

// Because do_work() is async, and becase you want to ensure that
// do_work() completes before starting task.run(5), you need to enclose
// these in an async function, eg doWorkThenRunTasks()
async function doWorkThenRunTasks() {

  // Call do_work asynchronously
  await do_work()

  // task.run will happen after do_work completed
  task.run(5);
}

doWorkThenRunTasks();
添加了async
doWorkThenRunTasks()
函数,允许您使用与
do\u work()
相关的
wait
来强制执行
任务的执行顺序。在
do\u work()完成后运行(5)


希望这有帮助

是的,这正是我想要的。谢谢