如何在不提供事件发射器的情况下,通过传递给事件发射器的回调来结束async
函数?
此外,不使用 * 外部模块 *,只需简单的NodeJS 7.x/8.x(支持Es6语法和async/await
)。
基本上,我们希望将async function ...
与事件发射器混合使用,以便在事件发射器发出end
信号时解析。
还要记住,在使用await
完成其他一些异步函数之前,我们不会从事件发射器开始。
如果我们有一个“新的承诺(......)”,我们就称之为决心(resolve);而且我们不能使用'return',因为我们是在回调中。
/*
* 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; ?
});
}
字符串
免责声明
我想道歉,如果这个问题已经在某处完成。所做的研究显示了与混合异步和同步逻辑相关的问题,但我没有发现任何关于这一点。
标题中的一个类似问题是this 'write async function with EventEmitter',但它与此问题无关。“
2条答案
按热度按时间t5zmwmid1#
我们可以从传递给事件发射器的回调函数中结束一个异步函数而不承诺事件发射器吗?
否.
async
/await
语法只是then
调用的糖,依赖于promise。字符串
2uluyalo2#
下面是一个类,它扩展了
Node.js EventEmitter
以支持异步事件侦听器,并提供了一个函数来等待事件完全处理,然后再继续执行代码的其余部分:字符串
示例
型