如何创建一个等待Java事件的异步函数?

阿米特·戈希尔(Ameet Gohil)

如何阻止该事件?

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);

实际结果
工作1
工作2
做某事
事件发生

事做某事

事做某事某事

预期结果
工作1
做某事
事件发生
工作2
做某事
做某事
做某事
做某事

达克里·丹尼

如果我正确理解了您的问题,则可以通过Promise包装task事件处理程序的a来实现

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处理程序,以便resolve一旦事件处理程序触发(即通过调用resolve()就可以调用promise 这允许继续调用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();

加入异步的doWorkThenRunTasks()功能,允许你使用await有关do_work()强制执行的执行顺序task.run(5)完成后do_work()

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

等待最后一个stream.on('data')事件中的异步函数回调

如何正确创建一个等待的方法

我如何等待2个dateChange事件并执行一个函数

如何创建一个可以等待多个进程退出的函数?

安排一个异步事件,当stdin在boost :: asio中有等待数据时将完成。

异步/等待模式。如何将等待方法传递给另一个方法

等待一个递归调用异步函数的函数

多个未连接的异步事件如何等待一个诺言

如何使用onSnapshot回调获取一个异步的React函数调用firebase.firestore.set等待?

事件:在另一个函数中创建WINDOW

异步等待:即使一个错误,如何在多个等待调用中获取数据?

异步等待:即使一个错误,如何在多个等待调用中获取数据?

如何让JQuery等待上一个事件触发

一个函数等待Java中的另一个函数

如何等待直到异步函数完成运行然后才继续运行另一个函数?

如何声明一个函数变量并等待它完成?

等待异步函数返回一个范围对象

等待异步函数在 Typescript 中返回一个值。

如何制作一个等待某些条件的函数?

异步函数在另一个函数中调用时不等待 Promise

如何使用 javascript 承诺使一个函数等待另一个函数异步完成运行?

如何使可链接的异步函数并行工作,然后只等待最后一个函数?

如何让另一个异步调用等待?

如何访问在另一个函数中异步创建的全局数据数组?

如何在 Reactjs 中创建一个不被事件监听器调用的函数?

如何在一个函数中创建条件等待方法?

如何等待一个函数在javascript中执行

如何让一个单独的同步函数等待另一个异步函数?

如何创建一个通用函数来包装异步闭包?