NodeJS 7:EventEmitter + await/async

Sig*_*ier 6 javascript asynchronous node.js

我们如何async从传递给事件发射器的回调中结束函数而不会使事件发射失效

也没有使用外部模块,只需简单的NodeJS 7.x/8.x(支持Es6语法和async/await.

我们基本上希望将a async function ...与事件发射器混合,以便在事件发射器发出信号时它会解析end.

另外请记住,在使用其他异步函数完成之前,我们不会从事件发射器开始await.

如果我们有一个"新的承诺(...)",我们会调用resolve(); 头痛将会结束,但在'异步'中没有'解决',加上我们不能使用'返回'因为我们在回调中.

/*
 * Example of mixing Events + async/await.
 */

// Supose a random pomise'd function like:
function canIHazACheezBurger () {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(Math.random() > 0.5);
    }, 500 + Math.random() * 500)
  });
}

/**
 * Then, we want to mix an event emitter with this logic,
 * what we want is that this function resolves the promise
 * when the event emitter signals 'end' (for example).
 * Also bear in mind that we won't start with the event emitter
 * until done with the above function.
 * If I had a "new Promise(...)" I would call resolve(); and the
 * headache would be over, but in 'async' there's no 'resolve',
 * plus I cannot use 'return' because I'm inside a callback.
 */
async function bakeMeSomeBurgers () {
  let canIHave = await canIHazACheezBurger();
  // Do something with the result, as an example.
  if (canIHave) {
    console.log('Hehe, you can have...');
  } else {
    console.log('NOPE');
  }
  // Here invoke our event emitter:
  let cook = new BurgerCooking('cheez');
  // Assume that is a normal event emitter, like for handling a download.
  cook.on('update', (percent) => {
    console.log(`The burger is ${percent}% done`);
  });
  // Here lies the problem:
  cook.on('end', () => {
    console.log('I\'ve finished the burger!');
    if (canIHave) {
      console.log('Here, take it :)');
    } else {
      console.log('Too bad you can\'t have it >:)');
    }
    // So, now... What?
    // resolve(); ? nope
    // return; ?
  });
}
Run Code Online (Sandbox Code Playgroud)

放弃

如果这个问题已在某个地方完成,我想道歉.完成的研究显示了与同步逻辑混合异步相关的问题,但我没有发现这一点.

标题中的类似问题是"使用EventEmitter写入异步函数",但它与此问题无关.

Ber*_*rgi 14

我们可以从传递给事件发射器的回调中结束异步函数而不会使事件发射器失效吗?

.async/ awaitsyntax只是then调用的糖,依赖于promises.

async function bakeMeSomeBurgers () {
  let canIHave = await canIHazACheezBurger();
  if (canIHave)
    console.log('Hehe, you can have...');
  else
    console.log('NOPE');

  // Here we create an await our promise:
  await new Promise((resolve, reject) => {
    // Here invoke our event emitter:
    let cook = new BurgerCooking('cheez');
    // a normal event callback:
    cook.on('update', percent => {
      console.log(`The burger is ${percent}% done`);
    });
    cook.on('end', resolve); // call resolve when its done
    cook.on('error', reject); // don't forget this
  });

  console.log('I\'ve finished the burger!');
  if (canIHave)
    console.log('Here, take it :)');
  else
    console.log('Too bad you can\'t have it >:)');
}
Run Code Online (Sandbox Code Playgroud)