如何在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
处理程序,以便在触发事件处理程序后可以调用promiseresolve
(即通过调用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();
添加了asyncdoWorkThenRunTasks()
函数,允许您使用与do\u work()
相关的wait
来强制执行任务的执行顺序。在do\u work()完成后运行(5)
希望这有帮助 是的,这正是我想要的。谢谢